现代的计算机是二进制的,在许多地方都要用到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