二进制中1的个数

面试题10:二级制中1的个数


第一种解法:采用右移并且与1按位 与运算,若是1则结果1否则为0,这样便可以统计出二级制中的1的个数,代码如下:


int count(int n){
    int count = 0;
    while(n){
           if(n>0){
               count++;
           }
           n = n>>1;
}
return count;
}

本来以为这道题很简单,但是问题出来了,右移时左边补位的原则是若是无符号数则补0,若是有符号数则补符号位。

上面的这种解法如果遇到一个负数可想而知,会进入死循环因为补的数字是1。

后来我想先判断一下是不是负数,后来发现太过于复杂。这时候突然想到很久前做过的一道题目:下面这段语句是用来干什么的?

while(n){
    ++count;
    n = n&(n-1);
}

当时还记得谁会那么无聊写这种程序,还特地去网上百度了,说是求一个10进制数的二进制有多少个1.

现在看来这个问题的出处应该在这里,采用n&(n-1)的方式这样会使得最右边的1变成0,这样就可以统计出有多少个1了,并且无须担心死循环,因为采用的是n&(n-1),不涉及到补位的问题。所以最终的代码是:

int count(int n){
    int count = 0;
    while(n){
         ++count;
          n = n&(n-1);
          
}
return count;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值