题解 | #二进制中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,&之后就会消去。

全部评论

相关推荐

猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务