1.判断是不是为2的幂次方:
将2的幂次方写成二进制形式后会发现其形式为:1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零。
n | n&(n-1) |
---|---|
2 | 10 & 01 = 0 |
4 | 100 & 011 = 0 |
8 | 1000 & 0111 = 0 |
16 | 10000 & 01111 = 0 |
即:若n是2的幂次方时,n和n-1二进制表示的同一位置绝不可能同时为0。
判断条件:
n > 0 && ((n & (n - 1)) == 0 )//由于==的优先级比&高,所以必须要加();
2.统计某一个数的二进制表示中1的个数:
例子:
n=10100
n-1=10011
则n & (n - 1)=10000
可以将最低位的1变为0;
(n & (n - 1))每执行一次都会将二进制n中最低位(即最右边)的1改为0,二进制表示中1的个数减一,最终值为0时,就没有1存在,最后count为n的二进制表示中1的个数。
代码如下:
while (n >0 ) {
count ++;
n &= (n-1);
}