1. 正数的补码不变,负数是它的正数的反码+1
2. 在计算机中,整数是以补码的形式存储的
技术难点——如何计算补码
(1)对正整数:
我们可以不进行任何操作,正数的补码就是其本身
(2)对负整数:
我们需要执行以下代码才能获取到负数的补码:
# 获取-10的补码
bin(-10 & 0b11111)
# 则对于整数n(n<0),它的补码获取过程为:
n = n & 0xFFF # 这一步得到n的补码对应的十进制(F的个数由题目决定)
bin(n) # 获取到n的补码的二进制形式
# 测试如果不加n = n & 0xFFF 这行代码会产生什么结果
n = -6
print(bin(n)) # -0b110
n = n & 0xF
print(n) # 10
print(bin(n)) # 0b1010
所以为了方便,我们都在代码开头加上n = n & 0xFFF
,来获取整数n的补码的十进制
下面附上代码 ,我用了两种方法,建议使用前先看一下Python——进制的转换、位运算规则
# 方法一
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
n = n & 0xFFFFFFFF # 得到n补码的十进制,这条语句特别针对n为负数的情况
count = 0
for c in str(bin(n)):
if c == '1':
count += 1
return count
# 方法二
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
n = n & 0xFFFFFFFF
count = 0
for i in range(32):
mask = 1 << i
if n & mask != 0:
count += 1
return count