当前位置 博文首页 > dadalaohua的博客:【位操作笔记】判断一个整数是否是2的次幂
2的次幂指的是2n,例如20,21,22,23,24,25,……
通过x & (x - 1)
来实现,这个公式会使x中位置最靠右并且值为1的bit位置0,例如0101 1010 =>0101 1000。
如果是x是2的次幂,那么就只会有一个bit位置1,那么这个公式就会将这个bit置0,所以结果就会是0。
例如:
20 = 0000 0001 ?? 20 - 1= 0000 0000
21 = 0000 0010 ?? 21 - 1= 0000 0001
22 = 0000 0100 ?? 22 - 1= 0000 0011
23 = 0000 1000 ?? 23 - 1= 0000 0111
24 = 0001 0000 ?? 24 - 1= 0000 1111
25 = 0010 0000 ?? 25 - 1= 0001 1111
……
如果输入的值是2的次幂,则返回true,反之返回false。
bool integer_is_a_power_of_2(unsigned int val)
{
return (val & (val - 1)) == 0;
}
上述的代码有个问题,如果输入的值为0,会错误地认为0是2的幂。
为了解决此问题,对代码做出以下优化:
bool integer_is_a_power_of_2_better(unsigned int val)
{
return val && !(val & (val - 1));
}
假设是26 = 0100 0000
0100 0000
& 0011 1111
-----------------
0000 0000
那么结果就会是0.
如果不是2的次幂,这里假设是0100 1010
0100 1010
& 0100 1001
-----------------
0100 1000
那么就结果就不为0,只会将最右侧值为1的bit清零。
Bit Twiddling Hacks By Sean Eron Anderson
[Hacker’s Delight] 作者: Henry S. Warren Jr.
cs