要测试无符号整数是否为2^n-1
形式,我们使用:
x&(x+1)
那应该是什么?也就是说,
x&(x+1) == ?
答案 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..00
,x+1
与x
的位数相同,但最低位除外,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为零。