求二进制中1的个数的几种解法

题目描述

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

牛客网题目链接

求解思路1

我们可以设置一个无符号整数1,从低位往高位(1-32)一直移动,然后与整数对应位置的数字进行比较(与运算),来实现计算1的个数,代码如下:

class Solution {
public:
     int  NumberOf1(int n) {
         int count=0;
         unsigned int flag=1;
         while(flag){
            if(n&flag){
                count++;
            }
            flag<<=1;//左移一位
         }
         return count;
     }
};
运行时间:3ms

占用内存:484k

求解思路2

一个非0的数n减去1的值我们计为tmp,则ntmp与运算后会得到下一个出现1的位置,我们将运算的结果赋给n,重新计算,这样的话有多少个1我们就计算多少次,而不是像思路1中的计算32

如四位二进制1000表示8,而8-1的四位二进制表示为0111,它们与运算的结果为0,因此,8的二进制中只有11,代码如下:

class Solution {
public:
     int  NumberOf1(int n) {
         int count=0;
         while(n){
            count++;
            n=(n-1)&n;
         }
         return count;
     }
};
运行时间:2ms

占用内存:484k
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值