题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
先想到的是对当前整数不断的和1做按&运算,可以判断最右边位置是不是1,然后整数右移,重复操作。
误区: 输入数字为负的时候,右移时在左边补充的1,一直右移,最后数字会变成0xFFFFFFFF而陷入死循环。
那,然后想到把1左移,不断和输入数字按位&,这样循环32次,可以判断完成。
注意应该是uint类型。
代码:
class Solution {
public:
int NumberOf1(int n) {
int cnt = 0;
unsigned int now = 1;
while(now >= 1) {
if (n & now) cnt++;
now = now<<1;
}
return cnt;
}
};