为了测试无符号整数是否为2^n-1
的形式,我们使用:
x&(x+1)
这句话的意思是什么?也就是说,
x&(x+1) == ?
为了测试无符号整数是否为2^n-1
的形式,我们使用:
x&(x+1)
x&(x+1) == ?
2^n-1
的数字将会在第n位之前所有的二进制位都被设置为1。例如,2^3-1
(7) 的二进制表示为:0b0111
0b1000
然后,进行按位与操作,我们发现结果为零,因为两个数字的任何一个二进制位都没有被设置。如果我们使用不是形如2^n+1
的数字开始,则结果将不为零。
x 0b????1000..00
x+1 0b????1000..01
x&(x+1) 0b????10000000
对于某个形如 0b????10111..11
的数 x
:
x 0b????10111..11
x+1 0b????110000000
x&(x+1) 0b????10000..00
x
既不是零,也不是用所有最低位设置的二进制书写的,则x&(x+1)
不为零。零。如果X是2的N次方减1,那么它在二进制中是一个由1组成的连续字符串。比它多一的数字是一个以1开头,长度与X相同的0字符串,因此这两个数字在任何位置都没有相同的1位,所以它们的AND结果为零。
2^n-1
。 - Michael Mrozekx&(x+1)==0
对于x
是2^n-1
的形式是必要的,但你们两个都没有提到这个属性的充分性。换句话说,为什么一个不是以0b0111..11
写成的数字x
不能具有属性x&(x+1)==0
? - Pascal Cuoq