描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
先学习一下什么叫补码?
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机系统中,数值一律用补码来表示和存储。
正整数的补码是其二进制表示,与原码相同。
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
首先还是要将输入的十进制整数转换为32位的二进制,因为python中没有位数这一概念,在python中通过bin(n & 0xffffffff)获得的并不是这个负数的补码,只是形式与 负数的32位二进制补码相同。
0xffffffff指32个1,等于说取后面32位,一个f四位。
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
if n < 0:
n = n & 0xffffffff
while n:
count += 1
n = (n - 1) & n
return count
假设n是100110,那么n-1就是100101,那么(n-1)& n就是100100
然后100100再减1就是100011,那么(n-1)& n就是100000,再减1就是011111,(n-1)& n就是000000。
所以计算到了1的个数就是3个。