x&(-x)取x的最后一个1的证明

转自: https://xtestw.com/2015/04/22/proof/#more

x&(-x)取x的最后一个1的证明##

明天要给新队员讲树状数组,避不开的一个证明,之前教主讲过,当时没听明白给忘了- -,只有自己想了一种证明方法。

证明#####

大家都知道,计算机是用补码来存储一个数的,在这种编码情况下,整数是自然状态编码,假设我们是一个5位的机器(只是假设),那么1,编码就为00001, 而-1的编码则是11111(并不是10001),在这种情况下,我们会有下面的结论:

             -x=11111 – x +1 (x 假设为正数二进制)  -----------------结论一
              x=00000 + x (x 假设为正数二进制) ----------------------结论二

我们还会有以下2个结论:

结论三:11111 - x 不会出现借位的情况(二进制下 ,对应位只会是两种情况 1-0 和 1-1)
结论四:00000 + x 不会出现进位的情况(二进制下,对应位只会是 0+1,0+0)

假设 x的二进制编码为 x1 x2 x3 x4 x5

那么我们就会发现 对于任何一位(以x1为例) 0+x1 和 1-x1 两个 必然是一个为1 一个为0,因为:

X1的值 0+x1 1-x1
0 0 1
1 1 0

有了上面的结论,我们把焦点放到x的最后几位,我们要分离的是最后一个1,那么假设是第i位xi是最后一个1,那么i位以后的每一位都是0,在这个基础上,根据上面这个表格,我们会发现,11111-x 这个值在第i位以后全部都是1,而第i位为0,整理一下,每一位如下:

1. X的每一位为  x1 ,x2,…… xi-1, 1 ,0,0,0…. 后面每一位都是0
2. 11111-x 结果的每一位为 1-X1,1-X2,….1-Xi-1 ,0,1,1,1….. 后面每一位都是1

下面这一点是关键 ,就是 –x = 11111-x +1, 也就是说-x的每一位是这样的:

					1-X1,1-X2,….1-Xi-1 ,1,0,0,0…..

也就是说,最后一位+1 ,然后会变成0 一直往前进位到第i位,将第i位变成1后停止进位, 我们现在比较一下 x 和 –x的每一位的值, 会发现 ,除了第i位为一样的1,其余每一位都是不一样的即,都是一组0,1. 那么

					X&(-X)= 0,0,0….1, 0,0,0,….

除了第i位是1,其他每一位的值都是0, 而根据我们最开始所说的,X的第i位的1就是X当前二进制编码的最后一个1,所以通过 x &(-x) 我们能够得到x的最后一个

posted on 2015-04-23 02:49  XtestW  阅读(225)  评论(0编辑  收藏  举报

导航