这是一种在不需要第三个变量的情况下交换a和b的方法。我理解XOR在真实表中的含义是“真”还是“假”,但它究竟在这做什么呢?当我们处理的数字不是布尔值时,XOR如何工作?
int a = 5; int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
答案 0 :(得分:7)
操作按位进行,每个数字的二进制编码中的每个位一次。
你玩过游戏“Lights Out”吗?每个灯都打开或关闭,每个按钮按下交换(XOR)一个模式。如果再次按下该按钮,则相同的交换会更改模式。如果按下组合按钮,情况也是如此。相同的按钮组合会将其更改回来 - 顺序不必相同。
同样的行为发生在游戏中,也发生在变量的按位操作中。当您将两个变量放在一起时,一个中的位用于切换另一个中的位。由于这种变化的性质,哪一个正在进行切换无关紧要 - 结果是相同的。两个数字中相同位置的相同位在结果中的该位置产生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
。
答案 1 :(得分:2)
XOR是一个按位运算符,所以你的数字是逐位异或的,例如
5 = 4+1 = 0101
10 = 8+2 = 1010
对于布尔人来说,众所周知,a xor b xor b = a
。只需一点一点地应用它,你就可以交换数字(或任何其他数据表示为位,所以计算机科学中的所有内容都是如此)。
答案 2 :(得分:1)
首先将它们转换为二进制,然后执行按位操作。
所以
a = 5 = 0000 0101
b = 10 = 0000 1010
然后逐位执行XOR,即
a^b = 0000 1111
(或15)。
逐位执行XOR意味着对数字中的每个位执行布尔XOR(您已经理解)。因此,使用真值表将a的第一个数字与b的第一个数字进行比较,然后将a的第二个数字与b的第二个数字进行比较,依此类推。
按照这个逻辑来获取:
int a = 5; int b = 10;
a = a ^ b; // a = 1111 = 15
b = a ^ b; // b = XOR (1111, 1010) = 0101 = 5
a = a ^ b; // a = XOR (1111, 0101) = 1010 = 10
答案 3 :(得分:1)
按位运算符独立处理变量中的所有位。
例如:
5=0101
8=1000
5|8=
0101
1000
=
1101
5&8=
0101
1000
=
0000
5^8=
0101
1000
=
1101
等
与+, - ,||,&&等运营商相比。它可以处理变量的全部值。