我有一个表示2个数字的XOR的变量。例如:int xor = 7 ^ 2;
我正在研究一个代码,根据注释找到在XOR中设置的最右边的位:
int rightBitSet = xor & ~(xor - 1);
我无法理解这段代码究竟是如何工作的。我的意思是在7^2
的情况下,它确实将rightBitSet
设置为0001
(二进制),即1.(实际上是最右边的位组)
但如果xor
为7^3
,则rightBitSet
设置为0100
,即4
,其值也与xor
相同(并且不是最右边的位集。)
代码的逻辑是找到一个数字,表示组成xor
的数字之间的不同位,尽管注释表明它找到了
最正确的位设置,在我看来,代码在任何地方找到一个具有1个不同位的位模式
我对么?我也不确定代码是如何工作的。似乎数字X
与其二进制表示中的数字X-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
的最低位。