问题:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
代码:
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
count=0
if n<0:
n=n&0xffffffff
while n :
count+=1
n=n&(n-1)
return count
运行时间:28ms
占用内存:5624k
相关知识点:
1. 原码,反码和补码:
正数:正数的原码,反码和补码相同,都是将正数转换为二进制, 正数的符号位为0
如: 1: 0000 0001
3: 0000 0011
负数: 首先将负数的符号位置为1,然后将其转换为二进制,即获得负数的原码;
符号位不变,其余位取反,即为负数的反码
在补码的基础上+1,即负数的补码
计算机字长为32位,负数&0xffffffff即可得到补码,如:
input :bin(-1&0xffffffff)
output:0b11111111111111111111111111111110
2. 关于 n&(n-1)
一个数字n,然后与 n-1 进行按位与,除了最靠右的 1 置零后,其他的高位的 1 没有发生变化,每运行一次,就可以知道有一个 1 .
如:6&5(十进制) 《==》0110&0101 =0100(二进制) = 4(十进制)