题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
【解题思路】因为n有可能是负数,所以不能让n右移,因为最高位1为符号位,不能算作是n本身。所以干脆用一个变量从低位向高位走,和n逐位相与,计数。
class Solution {
public:
int NumberOf1(int n) {
int sum = 0;
int flag = 1;
while(flag){
if(n & flag)
sum++;
flag = flag << 1;
}
return sum;
}
};
书上还有另一种巧妙的解法:
class Solution {
public:
int NumberOf1(int n) {
int sum = 0;
while(n){
sum++;
n = n & (n - 1);//把 n 最右边的1变为0,看能循环多少次
}
return sum;
}
};