2

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

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

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

4

1 回答 1

3

二进制数减 1 的效果是将其中最低有效的 1 替换为 0,并将所有低有效位设置为 1。例如:

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

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

于 2012-08-04T08:39:52.833 回答