题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
正数的补码:为原码自身
负数的补码:为原码的符号位不变,数值位按位取反末尾再加一
1、字符法
class Solution:
def NumberOf1(self, n):
# write code here
n = 0xFFFFFFFF & n
count = 0
for c in str(bin(n)):
if c == "1":
count += 1
return count
注:n = n & 0xFFFFFFFF,在Python中,数的大小是可以无限扩大的,不会像Java或c++中,数超过32位会溢出,而是继续扩张,所以对于一个负数而言,进行了这个操作,实际上是提取了负数的后32位(在计算机中以补码形式存在),前面的任意位呢,则变成了0,比如说 -1,一开始是 111…(n个1)…11111111,进行与运算之后,得到,00…(n个0)…111111111(32个1),变成了含32个1的正数,然后就不用担心负数陷入死循环。再比如复数,最高位1表示负号,但是这么一与,最高位的1不在表示负号,而是表示数值。
2、移位法
class Solution:
def NumberOf1(self, n):
''' letf shift method
count = 0
for i in range(32):
# 左移法
# mask = 1 << i
# if n & mask != 0:
# count += 1
# 右移法
count += (n >> i) & 1
return count
3、改进移位法
class Solution:
def NumberOf1(self, n):
count = 0
while n:
n = n & (n-1)
count += 1
n = 0xFFFFFFFF & n
return count
参考文章:
算法-求二进制数中1的个数