n&(n-1)的应用

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值