11.二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
记录
方法一:
直接转成二进制数,然后遍历求“1”的个数。
直接调用count()也可以,思想一样就行。
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
count=0
n = n&0xFFFFFFFF
for i in str(bin(n)):
if i == '1':
count+=1
return count
方法二:位与
1. n < 0
网站大佬的解释:对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环。与0xffffffff相与,就可以消除负数的影响.
0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)
具体可参考:Python中为什么可以通过bin(n & 0xffffffff)来获得负数的补码?
2. n = 0
无意义
3. n > 0
3 -> 00000011
count = 1:3&2 = 00000011 & 00000010 = 00000010
count = 2:2&1 = 00000010 & 00000001 = 00000000
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
count = 0
while n & 0xffffffff != 0:
count += 1
n = n & (n-1)
return count