这是一种无需第三个变量即可交换 a 和 b 的方法。我理解“异或”在真值表中“真”或“假”的含义,但它到底在做什么?当我们处理数字而不是 boolean 值时,XOR 如何工作?
int a = 5; int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
最佳答案
该操作按位进行,每个数字的二进制编码中的每个位一次。
你玩过“Lights Out”这个游戏吗?每个灯要么打开,要么关闭,每次按下按钮都会交换(异或)它们的模式。如果您第二次按下该按钮,相同的交换会将图案更改回来。如果您按下按钮组合,也会出现同样的情况。相同的按钮组合会将其更改回来 - 顺序不必相同。
同样的行为发生在游戏中以及变量的按位运算中。当将两个变量异或在一起时,一个变量中的位用于切换另一个变量中的位。由于这一变化的性质,哪个在哪个上进行切换并不重要 - 结果是相同的。两个数字中相同位置的相同位在结果的该位置产生 0。相反的位在该位置产生 1。
a = a ^ b;
a
现在设置为 a 和 b 的组合位掩码。 b
仍然是原来的值。
b = a ^ b;
b
现在设置为 (a XOR b) 和 b 的组合位掩码。 b 被取消,所以现在 b
设置为 a
的原始值。 a
仍设置为 a 和 b 的组合位掩码。
a = a ^ b;
a
现在设置为 (a XOR b) 和 a 的组合位掩码。 (请记住,b
现在实际上包含 a
的原始值)a 被取消,因此 a
现在被设置为原始值b
.
关于java - XOR (^) 交换算法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093606/