HOWTO · Python
Python 中的 XOR
了解如何在 Python 中使用 XOR,涵蓋整數與布林值的 ^ 運算子、位元運算、實際應用,以及 operator.xor()。
本頁內容
XOR,也就是互斥或(exclusive OR),會比較兩個值;只有恰好一個值為真時,結果才為真。在 Python 中,插入符號運算子(^)可以對整數和布林值執行 XOR。當你需要兩個值只能有一個成立,或需要直接比較各個位元時,就可以使用它。
什麼是 XOR?
XOR 會比較兩個位元:兩者不同時回傳 1,相同時回傳 0:
- 0 XOR 0 = 0
- 0 XOR 1 = 1
- 1 XOR 0 = 1
- 1 XOR 1 = 0
布林值也遵循相同規則:恰好一個 True 時,結果才是 True。對整數而言,Python 會將這項規則分別套用到每一對位元,因此布林 XOR 和位元 XOR 雖然相關,用途卻不同。
使用 XOR 處理整數
使用插入符號運算子(^)即可計算兩個整數的位元 XOR:
a = 5 # Binary: 0101
b = 3 # Binary: 0011
result = a ^ b
print(result)
6
5 的二進位表示是 0101,3 的二進位表示是 0011。逐一比較對應的位元後,結果如下:
- 0 XOR 0 = 0
- 1 XOR 0 = 1
- 0 XOR 1 = 1
- 1 XOR 1 = 0
結果是 0110,也就是十進位的 6。開頭的零只是用來讓兩個運算元對齊,不會改變數值。
使用 XOR 處理布林值
Python 也能對布林值套用 ^。以下程式會列出四種輸入組合,並示範由 and、or 和 not 組成、專門處理布林值的實作:
def xor(left, right):
return (left and not right) or (not left and right)
for left, right in ((False, False), (False, True), (True, False), (True, True)):
print(f"{left} ^ {right} -> {left ^ right}; xor() -> {xor(left, right)}")
False ^ False -> False; xor() -> False
False ^ True -> True; xor() -> True
True ^ False -> True; xor() -> True
True ^ True -> False; xor() -> False
當布林運算式需要一個具名操作時,這個函式很實用。對布林輸入而言,left ^ right 和 xor(left, right) 會產生相同的四種結果。這種邏輯寫法是針對布林條件設計的;若要處理整數位元,請使用 ^。
XOR 的實際應用
operator 模組提供的 xor() 函式可以執行相同的操作。當你需要一個函式物件時,它使用起來很方便,而且同時適用於布林值和整數運算元:
from operator import xor
print(xor(True, False))
print(xor(5, 3))
True
6
另一種廣為人知的位元技巧,是在不使用暫存變數的情況下交換兩個整數變數:
x = 10
y = 20
x = x ^ y
y = x ^ y
x = x ^ y
print(x, y)
20 10
假設一開始有兩個整數,這三次操作的流程如下:
x變成x與y的 XOR 結果。- 接著將新的
x與y做 XOR,讓y更新為x的原始值。 - 最後用相同的邏輯更新
x,讓它取得y的原始值。
這項技巧對整數變數是正確的,但一般 Python 程式碼使用元組解包通常更清楚:x, y = y, x。XOR 寫法主要適合用來理解位元運算,或在明確要求使用這項技巧的限制下使用。
結論
在 Python 中,使用 ^ 執行 XOR:對布林值,它會直接比較兩個值;對整數,它會比較每一個對應的位元。operator.xor() 函式以函式形式提供相同的操作,而 and、or 和 not 則能明確表達布林規則。請根據任務屬於邏輯運算還是位元運算,選擇最能清楚傳達意圖的寫法。
常見問題
-
Python 中的 XOR 是什麼意思?
XOR 代表互斥或:當兩個輸入恰好只有一個為真時,結果為真。對整數運算元而言,它會將這項規則套用到每一對對應的位元。 -
如何在 Python 中對兩個整數執行 XOR?
使用插入符號運算子:result = a ^ b。 -
Python 可以對布林值使用 XOR 嗎?
可以。True ^ False和False ^ True的結果是True,而兩個相同的布林輸入會產生False。 -
XOR 在程式設計中有什麼實際應用?
XOR 可以透過三次位元操作交換兩個整數變數。在一般 Python 程式碼中,元組解包通常更清楚。 -
XOR 在 Python 中具有交換律嗎?
有。XOR 具有交換律,因此對相容的運算元而言,a ^ b等於b ^ a。