题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题解
这道题用位运算会比较简单,对于正数,将这个数与0x00000001进行与运算,即可判断最低位是否为1,接着将数字右移一位,继续判断。对于补码负数,直接右移一位会导致最高位始终为一,发生死循环。因此要与0x80000000(二进制的1000.....0000)进行与运算,判断数字是否非0,并左移,从高位判断。
class Solution {
public:
int NumberOf1(int n){
int result = 0;
if(n == 0) return 0;
if(n > 0){
while(n){
result += n & 0x00000001;
n >>= 1;
}
}else{
while(n){
result += !!(n & 0x80000000); //判断是否非0
n <<= 1;
}
}
return result;
}
};