XOR(^)交换算法如何工作?

时间:2014-01-13 14:24:54

标签: java

这是一种在不需要第三个变量的情况下交换a和b的方法。我理解XOR在真实表中的含义是“真”还是“假”,但它究竟在这做什么呢?当我们处理的数字不是布尔值时,XOR如何工作?

int a = 5; int b = 10;

a = a ^ b;

b = a ^ b;

a = a ^ b;

4 个答案:

答案 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

与+, - ,||,&&等运营商相比。它可以处理变量的全部值。