下面的例程预计将交换和的a
值b
a = a ^ b
b = b ^ a
a = a ^ b
让我们分析一下交换是如何以及为什么起作用的。
为此,我们不要交换值,而是将它们存储在单独的变量中,这样我们就可以看到到底发生了什么。
a0 = a ^ b
b1 = b ^ a0
a1 = a0 ^ b1
使用 XOR 的以下属性简化方程。检查XOR Properties@Wikipedia以供参考
- 可交换的 (
a ^ b == b ^ a
)
- 联想 (
a ^ (b ^ c) == (a ^ b) ^ c
)
a ^ a == 0
0 ^ a == a
a0 = a ^ b // Equation #1
b1 = b ^ a0
a1 = a0 ^ b1
b1 = b ^ a0 // Equation #2
= b ^ (a ^ b) // Using Equation #1
= b ^ (b ^ a) // Property #1
= (b ^ b) ^ a // Property #2
= 0 ^ a // Property #3
= a // Property #4
a1 = a0 ^ b1
= a0 ^ (b ^ a0) // Using Equation #2
= (a ^ b) ^ (b ^ (a ^ b)) // Using Equation #1
= (b ^ a) ^ (b ^ (b ^ a)) // Using Property #1
= (b ^ a) ^ ((b ^ b) ^ a) // Using Property #2
= (b ^ a) ^ (0 ^ a) // Using Property #3
= (b ^ a) ^ a // Using Property #4
= b ^ (a ^ a) // Using Property #2
= b ^ 0 // Using Property #3
= b // Using Property #4
如您所见,b1
now 包含 的原始值a
和a1
包含 的原始值b
,即 和 的值b
被a
交换
总之,a^=b;b^=a;a^=b
只是一个惯用的表达方式,没有什么神奇之处:)
相同的简单英文解释
XOR 在操作数位不同时设置位,否则重置位
让我们通过一个示例来了解发生的转换。为此,我们将以下数字(二进制)分配给变量。
a = 1 1 0 0
b = 1 0 1 0
步骤 #1 : a = a ^ b
// 创建一个面具
a = 0 1 1 0
b = 1 0 1 0
想象 的新值是生成given的旧值或生成givena
的旧值的掩码。a
b
b
a
步骤 #2 : b = b ^ a
// 恢复a
使用掩码的原始值和原始值b
a = 0 1 1 0
b = 1 1 0 0
由于b
仍然保留/未触及,我们可以a
使用掩码恢复原始值 - 这就是我们在这一步中所做的
步骤 #3 :a = a ^ b
// 恢复b
使用掩码的原始值和原始值a
a = 1 0 1 0
b = 1 1 0 0
现在我们有了a
in 变量的原始值b
,所以我们可以使用相同的掩码来恢复 的原始值b
。我们现在可以覆盖掩码,因为在这一步之后我们不需要掩码。