题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。陷入死循环的代码
class Solution {
public:
int NumberOf1(int n) {
int m = 0;
while (n){
m+=(n & 1);
n>>=1;//此步如果n为正数,则AC;为负数,会陷入死循环,因为负
} //数右移一位后其最高位还是1
return m;
}
};
- 正确代码1
class Solution {
public:
int NumberOf1(int n) {
int m = 0,flag=1;
while (flag){
if(n & flag)
m++;
flag<<=1;//左移1,然后相与
} //既然右移n不行,考虑到左移1
return m;
}
};
- 正确代码2
class Solution {
public:
int NumberOf1(int n) {
int m = 0;
while (n){
m++;
n=n&(n-1);//n和n-1相与,相当于把n最右边的位由1变为0
}
return m;
}
};