排他的論理和(xor)の使い方【Python】

pythonのxorの記事のアイキャッチPython

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を使って実装

xorandornotを用いて作ることができるのは有名なので、その実装もやってみます
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

コメント