我学会了Fenwick Tree算法并且写了#34; i& (-i)等于最右边的位#34;
例如,3 & (-3) = 1, 48 & (-48) = 16.
。
我测试了i <= 64
的结果,所有值都满足条件。
但我不知道为什么条件满足(证明)所有正整数i。
请告诉我如何证明。
编辑:您可以假设我是32位整数(但16位是可以的)。如果是,则值i的范围为1 <= i <= 2^31-1
。
答案 0 :(得分:2)
假设你有一个二进制补码二进制数i
:
0b1101001010000000
并且您想找到-i
。好吧,-i
是i + (-i) == 0
的数字。那个属性有多少?好吧,如果你构建另一个数字:
i: 0b1101001010000000
-i: 0b0010110110000000
这样最右边的设置位与i
中的相同,之后的所有位都是0
,之前的所有位都与i
中的位相反:
i: 0b11010010 1 0000000
-i: 0b00101101 1 0000000
然后当你将这些数字加在一起时,数据包的左侧会传播,只留下所有0位,所以这是-i
。
现在,如果我们&
这些数字,我们会得到什么?好吧,尾随零&
一起产生零。左侧的位是i
和-i
中的对立面,因此它们&
一起生成零。但1
和i
中最右侧的设置位为-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的补码整数时,你:
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