为什么位操作i& (-i)等于最右边的位?

时间:2017-01-31 23:33:38

标签: math bit-manipulation

我学会了Fenwick Tree算法并且写了#34; i& (-i)等于最右边的位#34;
例如,3 & (-3) = 1, 48 & (-48) = 16.

我测试了i <= 64的结果,所有值都满足条件。
但我不知道为什么条件满足(证明)所有正整数i。

请告诉我如何证明。

编辑:您可以假设我是32位整数(但16位是可以的)。如果是,则值i的范围为1 <= i <= 2^31-1

3 个答案:

答案 0 :(得分:2)

假设你有一个二进制补码二进制数i

0b1101001010000000

并且您想找到-i。好吧,-ii + (-i) == 0的数字。那个属性有多少?好吧,如果你构建另一个数字:

 i: 0b1101001010000000
-i: 0b0010110110000000

这样最右边的设置位与i中的相同,之后的所有位都是0,之前的所有位都与i中的位相反:

 i: 0b11010010 1 0000000
-i: 0b00101101 1 0000000

然后当你将这些数字加在一起时,数据包的左侧会传播,只留下所有0位,所以这是-i

现在,如果我们&这些数字,我们会得到什么?好吧,尾随零&一起产生零。左侧的位是i-i中的对立面,因此它们&一起生成零。但1i中最右侧的设置位为-i,因此这是i & -i中唯一的设置位。

     i: 0b11010010 1 0000000
    -i: 0b00101101 1 0000000
i & -i: 0b00000000 1 0000000

答案 1 :(得分:2)

它甚至适用于负整数,它并不重要,我们可以证明它适用于一般的位串。

首先是i != 0案例:

使用字符串表示法,

- (a10 k )=(~a)10 k (根据定义,或通过计算-x = ~x + 1

请注意,不是0的数字总是采用a10 k 的形式,也就是说,它以&#34;任何&#34;开头,然后是最右边的1任意数量的零(可能为零)。

然后,

a10 k &amp; (~a)10 k = 10 k (&#39; a&#39;取消反转)

对于0的情况,好吧,没有最右边的1,所以它也不在结果中。

答案 2 :(得分:1)

当你递减一个2的补码整数时,你:

  1. 找到最右边的1位并将其设置为0;和
  2. 将所有低位设置为1
  3. 因此,

    i-1具有i所有的1位,除了最右边的位。

    补码~(i-1)因此与i共享 no 1位,除了最右边的一位,因此i & ~(i-1)仅包含最右边的1位在i

    如果我们注意到~x = -x-1,那么可以简化一下,~(i-1) = -(i-1)-1 = -i。因此i中最右边的1位只是i&-i

相关问题