n&(n-1)的应用

时间:2020-11-26 22:38:37

首先,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;
}


2.判断n是否为2的幂次:

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的个数),证闭。