- 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
- 负数用补码表示,所以运算方法和正数一样,无需做特殊考虑。
- 这里用到了一个很巧妙的运算方式,即
n & (n - 1)
,这个运算表示将最右边的1变成0,解释见下面
- 因为
n-1
表示将n
最右边的1变成0,然后把那一位后面的0全都变成1,前面不变,因此如果用n
和n-1
做与运算的话,n
原本最右边的1就变成了0 ,一直重复上面的过程直到n
变为全0 。
- 如果用Python的话,由于python的数据是动态的,可以认为是无限长的,存储的形式又是补码,因此负数就会有非常多的1,会导致无限循环,因此需要先用
n = n & 0xffffffff
代码把数据截取为32位,再进行操作。
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while(n){
count++;
n = n & (n - 1);
}
return count;
}
};
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n < 0:
n = n & 0xffffffff # 截断操作,因为python的数据是动态的,可以认为是无限长的
while n:
count += 1
n = (n - 1) & n
return count
class Solution:
def NumberOf1(self, n):
# write code here
return sum([(n>>i & 1) for i in range(0,32)])