二进制中1的个数
题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
示例1
输入
10
返回值
2
解题思路
- 使用右移。
例如:当n=0000 1101时,(n & 1) = 1,然后n右移一位得到0000 0110,再次和1进行与操作,直到 n=0 时停止右移。
其中要注意的是,正数右移高位填零,负数右移高位填1。所以如果n为负数,需要先计算出负数的补码,再进行右移和与操作。
def NumberOf1(self, n):
if n < 0 :
n = n & 0xffffffff #计算负数的补码
count = 0
while n > 0:
tmp = n & 1
count += tmp
n = n >> 1
return count
- 使用左移。
例如当n=0000 1101时,flag=1,(n & flag) >0则计数一次,然后flag左移一位得到10,再次和n进行与操作,重复32次。
def NumberOf1(self, n):
tmp = 0
count = 0
flag = 1
while tmp < 32:
if flag & n: #注意!这里不能写成 if flag & n == 1:
count += 1
flag = flag << 1
tmp += 1
return count
- 当(n-1) & n 时,最右边的1会变为0,1左边的数字不变,1右边的数字变为0。例如n=1100,n-1= 1011, (n-1) & n = 1011 & 1100 = 1000。
- 通过这种方式,循环操作直到n为0,循环的次数即为1的个数。
- 需要进行负数的补码转换
def NumberOf1(self, n):
if n < 0 :
n = n & 0xffffffff
count = 0
while n > 0:
n = (n-1) & n
count += 1
return count