题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
代码实现
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
if n<0:
n = n & 0xffffffff
count = 0
while n:
n = n & (n-1)
count += 1
return count
思路
如果一个数不为0,那么这个数(计算机用二进制表示)至少有一位为1 ,这个数减1,最右侧的1变0,1后面的0变1,用这个数与减1之后的数相与,得到的数是原来的数最右侧1变0的数。重复减一之后的操作,知道减1后变为0。
举个例子:1100,1100-1=1011,1100&1011=1000;
1000,1000-1=0111,1000&0111=0000;结束
对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环。与0xffffffff相与,就可以消除负数的影响。(通过限制位数32位就可以实现负数补码表示不至于右移出现全1的情况。)