《剑指offer》之Python二进制中1的个数
2020-01-17 本文已影响0人
a295ff153449
二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路:
如果一个整数不为0,那么这个整数至少有一位是1。
如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。
其余所有位将不会受到影响。
参考代码实现:
class Solution:
def NumberOf(self,n):
if n < 0:
print('负整数n==', n)
n = n&0xffffffff
print('负整数n==', n)
print('负整数的二进制转换 n==', bin(n))
# return n
print('正整数n==', n)
print('该数二进制==',bin(n))
print('该数二进制中1的个数==',bin(n).count("1"))
# return bin(n) ##bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
return bin(n).count("1")
#正整数的二进制
def PositiveInteger(self,numer):
a = bin(numer)
print('正整数二进制 a== ', a)
return a
#负整数的二进制
def NegativeInteger(self,number):
a = bin(number)
print('负整数二进制 a== ',a)
return a
def NumberOf1(self,n):
count = 0
if n < 0:
n = n & 0xffffffff
count = 0
while n != 0:
n = n&(n - 1)
count += 1
print('该整数二进制中包含的1的个数为count == ',count)
return count
solu = Solution()
solu.NumberOf(-2)
solu.PositiveInteger(-3)
solu.NegativeInteger(3)
solu.NumberOf1(2)
打印结果参考:
负整数n== -2
负整数n== 4294967294
负整数的二进制转换 n== 0b11111111111111111111111111111110
正整数n== 4294967294
该数二进制== 0b11111111111111111111111111111110
该数二进制中1的个数== 31
正整数二进制 a== -0b11
负整数二进制 a== 0b11
该整数二进制中包含的1的个数为count == 1