1. 统计N的二进制表示中1的个数
举个例子,比如
N = 0x75;
那么二进制表示就是 0111 01 01
(N - 1)的二进制是 0111 0100
容易看出二者 & 之后结果为 0111 0100 ,把最后 N 的二进制中最后一个1抹掉,按此方式循环下去,就可以统计出 N 的二进制中1的个数。
以上为奇数的例子。举个偶数的例子:
N = 100; //二进制为 0110 0100
那么 N- 1 的二进制为 0110 0011
& 之后,结果为0110 0000,同理抹去了最后一位1,循环即可统计出 N 中出现1的个数
int count(int N)
{
int Count = 0;
while(N > 0)
{
++count;
N &= (N-1);
}
return count;
}
2. 判断是否为2的方幂
2的方幂用二进制表示的话,其中只有一位为1,那么容易得到 N & (N - 1)的结果是 == 0 的,如果 N 不为2的方幂,那么N中至少有两个1,结果肯定不为 0,因此可以如下判断:
bool isTrue(int n)
{
bool result = false;
if(n > 0 && ((n&(n-1)) == 0))//注意:== 的优先级比 & 高
result = true;
return result;
}
3. N! 中含有质因数2的个数,还等于N 减去N的二进制表示中1的数目。// 《编程之美》P127
这个方法要比 [ N / 2 ] + [ N / 4 ] + [ N / 8 ] + [ N / 16 ] +.....