整数的二进制表示中1的个数(位运算)

给出一个整数,输出它的二进制表示中1的个数。

测试用例:

正数:边界值1,0x7FFFFFFF

负数:边界值0x80000000,0xFFFFFFFF

零:0

int numbersof1_1(int num)
{
    int sum=0;
    
    while(num)
    {
        if(num&1)
            ++sum;
            
        num>>=1;
    }
    
    return sum;
}

上面的解法可能引起死循环,对于负数,因为负数右移是删除二进制右边一位,然后左边加1,最后导致0xFFFFFFFF的死循环。另外,位运算就是相当于乘以2,除以2的运算,但是位运算的效率高于乘法运算。

int numbersof1_2(int num)
{
    int sum=0;
    int f=1;
    
    while(f)
    {
        if(num&f)
            ++sum;
            
        f<<=1;
    }
    
    return sum;
}

这是常规解法,通过对1左位移,避免了对整数的操作引起死循环,在循环了32次或64次(根据电脑位数决定)后循环结束。

int numbersof1_3(int num)
{
    int sum=0;
    
    while(n)
    {
        num=num&(num-1);
        ++sum;
    }
    
    return sum;
}

上面的是较优解法,举例说明,对于数1100,将它减1,得到1011,发现最右边的1变为了0,如果原来后边存在0,则全变为1,再将1011和它本身1100做与运算得到1000,发现相较于原数,最右边的1变为了0,记录下来,令sum++,知道整数为0结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值