HOWTO · Python

Python 中的 XOR

了解如何在 Python 中对整数和布尔值执行 XOR,掌握 ^ 运算符、逻辑实现、operator.xor 以及 XOR 的实际应用。

本页内容

XOR(exclusive OR,即异或)用于比较两个值:仅当其中一个值为真时,结果才为真。在 Python 中,脱字符运算符(^)可以对整数和布尔值执行 XOR。需要“二者取其一但不能同时取二者”,或需要直接比较各个比特时,都可以使用 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 即 exclusive OR(异或):当两个输入中恰好有一个为真时,结果为真。对于整数操作数,它会对每一对对应的比特应用这一规则。

  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。