这个涉及xor的代码实际上是如何工作的?

时间:2012-08-04 08:20:57

标签: java algorithm bit-manipulation bitwise-operators

我有一个表示2个数字的XOR的变量。例如:int xor = 7 ^ 2;
我正在研究一个代码,根据注释找到在XOR中设置的最右边的位:

int rightBitSet = xor & ~(xor - 1);

我无法理解这段代码究竟是如何工作的。我的意思是在7^2的情况下,它确实将rightBitSet设置为0001(二进制),即1.(实际上是最右边的位组)
但如果xor7^3,则rightBitSet设置为0100,即4,其值也与xor相同(并且不是最右边的位集。) 代码的逻辑是找到一个数字,表示组成xor的数字之间的不同位,尽管注释表明它找到了 最正确的位设置,在我看来,代码在任何地方找到一个具有1个不同位的位模式 我对么?我也不确定代码是如何工作的。似乎数字X与其二进制表示中的数字X-1之间存在某种关系?
这段关系是什么?

1 个答案:

答案 0 :(得分:3)

从二进制数中减去1的效果是用0替换其中的最低有效1,并将所有不太重要的位设置为1.例如:

5 - 1 = 101 - 1 = 100 = 4
4 - 1 = 100 - 1 = 011 = 3
6 - 1 = 110 - 1 = 101 = 5

因此,在评估x & ~(x - 1)x以下最不重要的1时,~(x - 1)的设置位与~x相同,因此x以上最低有效1,x & ~(x-1)没有1位。根据定义,x在最低有效位1处有1位,正如我们在上面看到的那样~(x - 1)也是如此,但~(x - 1)将低于该点0。因此,x & ~(x - 1)只有一位,位于x的最低位。