小言_互联网的博客

剑指offer 二进制中1的个数

260人阅读  评论(0)

时间限制:1秒 空间限制:32768K 热度指数:508351

本题知识点: 进制转化 补码反码原码

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题目链接:题目链接

这题看上去简单,但是我写错了啊!写了个负数会陷入死循环的版本。。。看来对底层还是了解不够。我把错误的写法贴出来,共同学习吧!

class Solution {
public:
     int  NumberOf1(int n) {
         int num = 0;
         while(n)
         {
             if (n & 1)
                 num++;
             n = n>>1;    //错在这,如果是负数,右移时高位会自动补1,由此陷入死循环
         }
         return n;
     }
};
//正确写法
class Solution {
public:
     int  NumberOf1(int n) {
         int num = 0;
         while(n)
         {
             num++;
             n = n & (n-1);
         }
         return num;
     }
};
//或者
class Solution {
public:
     int  NumberOf1(int n) {
         int num = 0;
         int flag = 1;
         while(flag)
         {
             if(n & flag)
                 num++;
             flag <<= 1;
         }
         return num;
     }
};

 


转载:https://blog.csdn.net/qq_36602048/article/details/102091766
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场