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

全部评论

相关推荐

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