首先,n&(n-1)可以把n的二进制表示的最低位的1置为0,假如n=6:
n&(n-1)=6&5=110&101=100
所以,根据这点,该表示式有如下几个应用
1.计算n的二进制表示有多少个1:
int one_num(int n){ int num=0; while(n){ n=n&(n-1); num++; } return num; }
bool is_power(int n){ if(n>0 && !(n&(n-1)) ){ return true; } return false; }
3.计算n!的质因子2的个数:
原计算函数为:个数f(n)=n/2+n/4+n/8+.....
经过推到等价于:个数=n-(n的二进制1的个数)[来之编程之美]
证明:假设n=10101,则n=10000+00100+00001=a+b+c,既a=10000,b=00100,c=00001
对n套用原函数推导,得出
a/2=01000,a/4=00100,a/8=00010,a/16=00001
所以,a/2+.....+a/16=01111=10000-1
以此类推,b/2+....+b/16=00100-1,c/2+...+c/16=00001-1
故,f(10101)=f(a+b+c)=10101-3=n-(n的二进制1的个数),证闭。