一、分析一下
(n&(n-1))==0——n是否是一个2幂次方的数?
1、找规律
0:0000
1:0001
2:0010
3:0011
4:0100
5:0101
6:0110
7:0111
8:1000
......
我可以发现1&0等于0;2&1等于0;4&3等于0;8&7等于0。
1、2、4、8都是2幂次方的数。
二、实战场景
1、判断当前编译环境指针的大小是否正确。
我们知道指针的大小肯定为一个2幂次方的数。
const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8;
assert((align & (align-1)) == 0);
2、求一个数的二进制表示中1的个数
while (n >0 )
{
count ++;
n &= (n-1);
}