使用位操作来判断无符号整数是否可以以2 ^ n-1的形式表示

时间:2010-06-20 18:58:51

标签: algorithm bit-manipulation

要测试无符号整数是否为2^n-1形式,我们使用:

x&(x+1)

那应该是什么?也就是说,

x&(x+1) == ?

3 个答案:

答案 0 :(得分:7)

许多形式2^n-1将所有位都设置为第n位。例如,2^3-1(7)是:

0b0111

如果我们添加一个,我们得到8:

0b1000

然后,执行按位,我们看到我们得到零,因为两个数字都没有设置位。如果我们从不是2^n+1形式的数字开始,那么结果将是非零的。

答案 1 :(得分:6)

作为对现有答案的补充,这里简要说明为什么数字x不是0b00000(零)或0b0111..11的形式(所有最低位设置,这些是n> 0的所有数字2 ^ n-1)没有属性x&(x+1) == 0

对于x格式的0b????1000..00x+1x的位数相同,但最低位除外,x & (x+1)的位数为x至少一位设置,显示为在x 0b????1000..00 x+1 0b????1000..01 x&(x+1) 0b????10000000 中设置的位。通过简短的解释:

x

对于0b????10111..11格式x 0b????10111..11 x+1 0b????110000000 x&(x+1) 0b????10000..00 的数字:

x

总之,如果x&(x+1)不是零或以二进制形式设置所有最低位数,那么{{1}}不为零。

答案 2 :(得分:5)

零。如果X是2 ^ N-1,则它是二进制的1的完整字符串。除此之外是1后跟一串与X相同长度的零,因此这两个数字在任何位置都没有共同的1位,因此两者的AND为零。