1.思路:
由于负数用的是补码表示,因此先判断n的正负性,正数则一位一位判断是否为1,负数则先用 n = -n - 1,将其转换为各个位取反后的正数,再算1出现的次数,最后用总位数32减去1出现的个数即可(注意此处不能直接统计0的个数,因为while循环会提前停止)。
2.代码:
class Solution {
public:
int NumberOf1(int n) {
int res = 0;
int tmp;
//if(n == -2147483648) return 1;
if(n >= 0) {
tmp = n;
while(tmp != 0) {
if(tmp % 2 == 1) {
res++;
}
tmp = tmp >> 1;
}
return res;
} else {
tmp = -n - 1;
while(tmp != 0) {
if(tmp % 2 == 1) {
res++;
}
tmp = tmp >> 1;
}
return 32 - res;
}
}
};