n&(n-1) 的用法

Posted by Johnnwen on May 4, 2016

n&(n-1) 的用法

  • 求某一个数的二进制表示中1的个数
while (n >0 ) {
      count ++;
      n &= (n-1);
}
  • 判断一个数是否是2的方幂

n > 0 && ((n & (n - 1)) == 0 )

  • 计算N!的质因数2的个数。

容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + …. 下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示) 现在我们跟踪最高位的1,不考虑其他位假定为0, 则在

[N / 2] 01000

[N / 4] 00100

[N / 8] 00010

[N / 8] 00001

while(n){
	n = n << 1;
	count += n;
}