计算二进制中1的个数

int countones1(unsigned int n)
{
    int ones = 0;
    while(0 < n)
    {
       ones += (n & 1);
       n >> 1;
    }
    return ones;
}

复杂度O(logn)

int countones2(unsigned int n)
{
    int ones = 0;
    while(0 < n)
    {
       ones++;
       n &= n-1;
    }
    return ones;
}

复杂度O(countOnes(n))

#define POW(c) (1 << (c))
#define MASK(c) (((unsigned int)-1) / (POW(POW(c)) + 1)) 
#define ROUND(n, c) (((n) & MASK(c)) + (((n) >> POW(c)) & MASK(c)))

int countOnes3(unsigned int n)
{
    n = ROUND(n, 0);
    n = ROUND(n, 1);
    n = ROUND(n, 2);
    n = ROUND(n, 3);
    n = ROUND(n, 4);
    return n;
}

复杂度为O(log2(W)),W=log2(n)为整数的位宽,即为O(loglogn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值