异或交换法可不借助临时变量完成两整数交换,依据自反性、恒等性及交换结合律,经三步:a=a^b、b=a^b、a=a^b;但仅适用于整数,且a、b不能为同一变量。

可以利用异或(^)运算的数学性质,在不借助临时变量的前提下完成两个整数的交换。核心在于异或的三个关键特性:自反性(a ^ a = 0)、恒等性(a ^ 0 = a)和交换结合律(a ^ b ^ c = c ^ a ^ b)。
异或交换的三步过程
设初始值 a = x,b = y,执行以下三步:
- a = a ^ b → 此时 a 变为 x ^ y
- b = a ^ b → 即 (x ^ y) ^ y = x ^ (y ^ y) = x ^ 0 = x,b 得到原 a 的值
- a = a ^ b → 即 (x ^ y) ^ x = y ^ (x ^ x) = y ^ 0 = y,a 得到原 b 的值
代码示例(以 C/Java/Python 风格表示)
以 Python 为例(注意:Python 中整数是对象,此处适用于可变变量场景,如列表元素或 C 风格变量):
a, b = 5, 9a = a ^ b # a → 12 (5 ^ 9)
b = a ^ b # b → 5 (12 ^ 9)
a = a ^ b # a → 9 (12 ^ 5)
print(a, b) # 输出:9 5
需要注意的关键限制
- 仅适用于整数类型:浮点数、字符串、对象等不支持位运算,无法直接使用
- 不能用于同一变量地址(如 a 和 b 指向同一内存):若 a == b(例如交换数组中同一个位置的元素),三步后结果会变为 0
- 可读性与维护性较低:相比 temp = a; a = b; b = temp,异或写法不易理解,现代编译器通常已对普通交换做优化,无需手动“炫技”
为什么它能工作?本质是代数推导
把每一步看作代数替换:
- 第1步后:a₁ = x ^ y,b₁ = y
- 第2步:b₂ = a₁ ^ b₁ = (x ^ y) ^ y = x
- 第3步:a₂ = a₁ ^ b₂ = (x ^ y) ^ x = y
整个过程未引入外部值,仅靠异或的代数封闭性完成信息互换。










