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

二进制中1的个数

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

对于非负数,其补码就是其源码,若其为偶数则最右边一位为0,若其为基数则最右边一位为1,每次判断其奇偶性,并更改1的个数,然后将数字右移一位,直到数字为0。
对于负数,其补码为原码取反再加一,不好直接通过奇偶性统计1的个数,要先模拟该数变为补码的操作,所以先将其取绝对值,再转换为无符号类型unsigned,在对unsigned进行变为补码的操作,即取反再加一即可。

class Solution {
public:
     int  NumberOf1(int n) {
         else if(n >= 0){
             int count = 0;
             while(n){
                 if(n%2){
                     count++;
                 }
                 n = n >> 1;
             }
             return count;
         }
         else{
             n = abs(n);
             unsigned num = ~n;
             num++;
             int count = 0;
             while(num){
                 if(num%2){
                     count++;
                 }
                 num = num >> 1;
             }
             return count;
         }
     }
};
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务