题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
原码反码补码定义:
符号位都是用0表示“正”,用1表示“负”。
反码:
正整数的反码 = 原码
负数的反码 = 原码除符号位外的所有位取反
补码:
正整数的补码 = 原码
负数的补码 = 数字的反码加1
int类型取值范围: [ -2^31 , 2^31-1]
详解参考: https://blog.csdn.net/y12345678904/article/details/52854230
2^31 - 1 的原码为 0111 1111 1111 1111 1111 1111 1111 1111
-2^31 的原码为 1000 0000 0000 0000 0000 0000 0000 0000
对一个数n,求其反码 :2^31-1 - n
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
if n >= 0:
ans = 0
else:
ans = 1
n = 2**31 + n # 反码 + 1
if n == 0:
return 1 # 最小的负数
for i in range(31):
ans += n//(2**(30-i))
n = n%(2**(30-i))
return ans