题目
输入一个整数,输出该数二进制表示中1的个数。
容易引起死循环的解法
def solution1(self,n):
count = 0 # 用于计算1的个数
while n: # 只要还不等于0
if (n & 1): # 如果n和1相与为1,代表最低位为1,其中&表示位运算
count+=1
n = n >> 1 # 右移一位使得原来的第二位变成现在的第一位
# 这种方式为什么会引起死循环,因为当n为负数的时候,显然最左边会补1,这种情况下根本就没办法停止循环
return count
常规解法
def solution2(self,n):
count = 0
flag = 1 # 上一个方法是移动数字n,这次我们移动数字1即可。
while flag:
if (n & flag): # 若位运算结果为1,则那一位为1
count += 1
flag = flag << 1 # 将1左移一位
return count
会给面试官带来惊喜的解法
一个整数减去1,可以将其最右边第一个1一直到最右边为止的所有数位取反。如:
1011−1=1010
1100−1=1001
利用这个性质,原数和减去1之后的数做与运算,则可以去掉原数最右边的一个1,有多少个1就可以做多少次这样的运算。
def solution3(self,n):
count = 0
while n:
count += 1
n = n & n-1
return count