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

二进制中1的个数

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

这种问题,第一反应将其转化为二进制,计算1的个数(n%2),但是无法处理负数,因为负数用的补码。
那么第二种就是位运算,这里存在一个问题,整数从左移位还是从右移位,如果是正数,那两边移位都可以,但是负数情况有些特殊,负数是补码。建议用1一次左移位去判断,给定数二进制位是否为1。
以上就是自己的想法:
代码:

class Solution {
public:
     int  NumberOf1(int n) {
         int m = 1,l = 0,sum = 0;
         while(l<32){
             if((n&m) != 0)
                 sum++;
             m <<= 1;
             l++;
         }
         return sum;
     }
};

后看了题解,发现还有技巧:

int val; // input data
int ans = 0;
while (val != 0) {
    ++ans;
    val = val & (val-1);
}

巧妙在每次减一,再进行&操作,就会消去一位1。因为每次减1,那么二进制中若存在1,那么一定有一个1会变为0,&之后就会消去。

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务