之前已经有人写过类似的解决方法了,引用比较多的是:(x - 1) & x == 0。这个方法比较直观,基本思路是:如果 x 是 2 的幂,那么它的二进制一定是由 1 个 1 和若干个 0 组成,那么(x - 1)是由 x 低位的所有 0 取反而来,因此 (x - 1) & x 等于 0。
除了上述方法,还可以用下面的方法来判断:
(x & -x) == x
思路和上面的基本一样,其中 (x & -x) 是由 x 二进制中最低位的 1 及其后面的 0 所构成的数,如果 x 是 2 的幂,那么 (x & -x) 应该等于 x,因为 x 的二进制中只有一个 1。
测试代码如下:
#include <stdio.h>
int main(void)
{
unsigned long x;
for (x = 0; x < 1000000000; x++)
if ((x & -x) == x)
printf("x = 0x%0lx\n", x);
return 0;
}
输出结果如下:
$ gcc -o main main.c
$ ./main
x = 0x0
x = 0x1
x = 0x2
x = 0x4
x = 0x8
x = 0x10
x = 0x20
x = 0x40
x = 0x80
x = 0x100
x = 0x200
x = 0x400
x = 0x800
...