Pythonでは and
or
not
といった論理演算子がありますが、xor
は使えるのでしょうか?
結論から言うと、xor
という論理演算子は使うことはできません
print(1==1 and 2==1) # False
print(1==1 or 2==1) # True
print(1==1 xor 2==1) #SyntaxError: invalid syntax
しかしxor自体は実現することは簡単なので、その方法を紹介します
xorのやり方
実は !=
実は !=
というのがxor
になっているので、これだけで簡単にxor
が扱えてしまいます
この方法がおそらく一番簡単で綺麗ですね
def xor(a,b):
return bool(a) != bool(b)
print(xor(False, False))
# False
print(xor(False, True))
# True
print(xor(True, False))
# True
print(xor(True, True))
# False
^ビット演算子
^ビット演算子はxor
を行ってくれるものです(論理演算子ではないので注意)
print(False ^ False)
# False
print(False ^ True)
# True
print(True ^ False)
# True
print(True ^ True)
# False
先ほども書いた通り、論理演算子ではなく、ビット演算子ですのでビットごとにxor
が適応されることに注意しましょう
例えば、数値で^
演算子を使うとこんな感じになります
print(1 ^ 2)
# 3
# 01 = 1
# 10 = 2
# xorすると
# 11 = 3
なので、数値等に使う場合はbool()
を使う必要があるわけです
print(bool(1) ^ bool(2))
# False
operator.xor
標準モジュールであるoperator
にxor関数が用意されています
しかしこれは^演算子と同じ動きをするので、わざわざ関数を使う必要もないように思います
また^演算子で紹介したように^演算子はビット演算子ですので、数字に対して使う際は注意しましょう
from operator import xor
print(xor(False, False))
# False
print(xor(False, True))
# True
print(xor(True, False))
# True
print(xor(True, True))
# False
print(xor(1, 2))
# 3
and or notを使って実装
xor
はand
とor
、not
を用いて作ることができるのは有名なので、その実装もやってみますxor
がないのはこの3つで実装できることにあるのかもしれませんね
論理回路がわかる方はこれが一番わかりやすいかも
def xor(a, b):
c = (bool(a) and (not bool(b))) or ((not bool(a)) and bool(b))
return c
print(xor(False, False))
# False
print(xor(False, True))
# True
print(xor(True, False))
# True
print(xor(True, True))
# False
print(xor(1,2))
# False
コメント