这里先做一个前奏:

int a = 0xF0;    //a = b1111 0000
a = a & (a - 1);    //a = b1110 0000
a = a & (a - 1);    //a = b1100 0000
a = a & (a - 1);    //a = b1000 0000
a = a & (a - 1);    //a = b0000 0000

上面这段程序可以发现这样的规律:a & (a - 1)这个操作的运行结果就是将数据a中的最低位的bit1清零,如果数据a中没有bit1,则该操作不影响数据a。

这样我们就可以使用这个操作做很多事情了,例如计算数据中有多少个bit1:

int count_bit1(int m)

{

    int count = 0;

    while(m)

    {

        m = m & (m-1);

        count++;

    }

    return count;

}

如果一个数为2的n次方幂,那么这个数据的二进制数中只能有一个bit1,例如b0001、b0010、b1000等,所以使用上面的操作可以判断数据是否为2的n次方幂如下程序所示:

int is_number(int num)

{

    if( m & (m - 1) == 0)

        return 0;//如果一个数是2的N次方,返回0

    else

        return 1;//如果一个数不是2的N次方,返回1

}