题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解析:这道题有点意思。
解法1:先讲不论python,c++都会陷入死循环的方法。先判断该数最低位是不是1,如果是1,cou加一右移,否则直接右移,直至该数变为0 。怎么判断最低位是否为1,很简单,将该数与1相与,结果为1说明最低位为1,否则为0.
代码如下(python):
class Solution:
def NumberOf1(self, n):
# write code here
cou = 0
#if n < 0:
#n = n & 0xffffffff
while n:
if n & 1:
cou = cou + 1
n = n >> 1
return cou
这种解法有一个明显缺点,当输入为负数时,由于负数在计算机中用补码表示,最高位是符号位1,因此不断右移的过程中最高位不断补1,造成死循环。
解法2:再来看c++,java等都可行的方法。为了避免死循环,我们可以不右移输入数字。首先将数字与1做与运算,判断最低位是不是1,接着将1左移一位得到2,继续与数字相与,判断次低位是否为1,这样反复左移,