【正确答案】方法一:移位法
可以采用位操作来完成。具体思路如下:首先,判断这个数的最后一位是否为1,如果为1,那么计数器加1,然后,通过右移丢弃掉最后一位,循环执行该操作直到这个数等于0为止。在判断二进制表示的最后一位是否为1时,可以采用与运算来达到这个目的。具体实现代码如下:
#判断n二进制码中1的个数
def countOne(n):
count=0 #用来计数
while n>0:
if(n&1)==1:#判断最后一位是否为1
count+=1
n>>1 #移位丢掉最后一位
return count
if __name__=="__main__":
print countOne(7)
print countOne(8)
程序的运行结果为:
3
1
算法性能分析:
这种方法的时间复杂度为O(N),其中N代表二进制数的位数。
方法二:与操作法
给定一个数n,每进行一次n&(n-1)计算,其结果中都会少了一位1,而且是最后一位。例如,n=6,其对应的二进制表示为110,n-1=5,对应的二进制表示为101,n&(n-1)运算后的二进制表示为100,其效果就是去掉了110中最后一位1。可以通过不断地用n&(n-1)操作去掉n中最后一位1的方法求出n中1的个数,实现代码如下:
def countOne(n):
count=0 #用来计数
while n>0:
if n!=0: #判断最后一位是否为1
n=n&(n-1)
count+=1
return count
if __name__=="__main__":
print countOne(7)
print countOne(8)
算法性能分析:
这种方法的时间复杂度为O(m),其中m为二进制数中1的个数,显然当二进制数中1的个数比较少的时候,这种方法有更高的效率。
【答案解析】[考点] 如何求二进制数中1的个数