题解 | #二进制中1的个数#

二进制中1的个数

http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8

题目难度:中等
题目考察:数学,二进制
题目内容:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

题目分析: 首先考虑正数,负数的二进制是正数的补码,可以通过正数计算得出
对于正数,即将数拆分成二进制,统计1的个数
有几种方法
算法1(辗转相除)
首先思考如何统计10进制下的每一位,例如n=1234,最后一位即是n%10,然后把4”删除”,即n/=10,这时候n=123,重复上述操作即可
二进制其实同理,和十进制操作一样,例如n=14如图
图片说明
即可统计出1的个数
算法2(位运算)
n>>1即在二进制下右移一位,所以可以遍历一遍0到31,统计1的个数

for(int i=0;i<32;i++)
    ans+=(n>>i)&1;

这时已经解决了正数的情况,下面考虑负数的情况
负数是正数的补码,补码即是反码加1,反码即是原码取反,即0变1,1变0
下面给出反码求法
图片说明
这种解法利用了纯推导,并没有用到什么神奇解法,较为容易接受。
下面给出代码

class Solution {
public:
     int  NumberOf1(int n) {
         int ans=0;
         if(n<0)
         {//负数则转化为正数
             n=2147483648+n;
             ans++;
         }
             for(int i=0;i<32;i++)
                 ans+=(n>>i)&1;//统计二进制1的个数
             return ans;

     }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务