时间限制: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
查看评论