现代的计算机是二进制的,在许多地方都要用到2的幂数,比如4,8,16,32,64,128等这些数字。并且在许多内存分配函数也是以这些数字为值进行分配的。那么如何快速判断一个数是不是2的幂数呢?
今天在看内核代码的时候,发现内核中是这样做的,其思想也是非常的简单!
基本思想是:
十进制表示 二进制表示
4 100
3 011
8 1000
7 0111
16 10000
15 01111
32 100000
31 011111
通过观察以上的几个2的幂数的二进制以及比他们小一的数的二进制形式,会发先:
如果n是2的幂数的话,那么n的二进制形式中只能有一个1存在,而 n-1 则有2的对数个连续的 1;
所以,判断一个数是否是2的幂数的代码如下:
bool is_power_of_2(int n)
{
return ( n != 0 && ( n & (n-1) ) == 0 )
}
首先:判断 n 是否为 0, 如果是 0 的话,返回0表示不是2的幂数
如果不是0的话, 如果 n 为 2的幂数的话, n & (n-1)结果为 0
如果 n不为2的幂数的话, n & (n-1)结果不为0
转载于:https://blog.51cto.com/weiguozhihui/1575226