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

假設一開始有兩個整數,這三次操作的流程如下:

  1. x 變成 x 與 y 的 XOR 結果。
  2. 接著將新的 x 與 y 做 XOR,讓 y 更新為 x 的原始值。
  3. 最後用相同的邏輯更新 x,讓它取得 y 的原始值。

這項技巧對整數變數是正確的,但一般 Python 程式碼使用元組解包通常更清楚:x, y = y, x。XOR 寫法主要適合用來理解位元運算,或在明確要求使用這項技巧的限制下使用。

結論

在 Python 中,使用 ^ 執行 XOR:對布林值,它會直接比較兩個值;對整數,它會比較每一個對應的位元。operator.xor() 函式以函式形式提供相同的操作,而 and、or 和 not 則能明確表達布林規則。請根據任務屬於邏輯運算還是位元運算,選擇最能清楚傳達意圖的寫法。

常見問題

  1. Python 中的 XOR 是什麼意思?
    XOR 代表互斥或:當兩個輸入恰好只有一個為真時,結果為真。對整數運算元而言,它會將這項規則套用到每一對對應的位元。

  2. 如何在 Python 中對兩個整數執行 XOR?
    使用插入符號運算子:result = a ^ b。

  3. Python 可以對布林值使用 XOR 嗎?
    可以。True ^ False 和 False ^ True 的結果是 True,而兩個相同的布林輸入會產生 False。

  4. XOR 在程式設計中有什麼實際應用?
    XOR 可以透過三次位元操作交換兩個整數變數。在一般 Python 程式碼中,元組解包通常更清楚。

  5. XOR 在 Python 中具有交換律嗎?
    有。XOR 具有交換律,因此對相容的運算元而言,a ^ b 等於 b ^ a。