二进制 中 1 的 个数

题目来源:

 https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 
分析:

 计算二进制中1的个数,以前在LeetCode上面好像遇到过这个题目,记得当是也是对答案拍案叫绝,这次尽然没有想起来

自己的代码:
class Solution:
    def NumberOf1(self, n):
        # write code here
        count=0
        if n<0:
            n=n&0xffffffff
        while n!=0:
            count+=1
            n= n&(n-1)
        return count
代码效率/结果:
 
优秀代码:
代码效率/结果:
 
自己优化后的代码:
 
反思改进策略:

 1.怎么统计1的个数?

利用小技巧x&(x-1)可以将整数最右边的1变成0,通过这个小技巧,我们只要循环判断n=n&(n-1)是否为0,即可统计1的个数。

2.关于计算机中补码的操作

9的源码为0000  1001

如果是负数的话,补码为最高位置1 ,

其余取反也就是1111  0110,然后在最低位加1即可即1111  0111

在python里面也是这样存储的,这里有一个问题:如果负数的话,不处理,那么n-1这个操作,会使得10000,下一次全部变成11111,因为符号位是不会右移变成0的,会不断补充1进去

这里使用一个方法,n & 0xffffffff,这样可以使带符号数变成无符号数,这样就可以顺利的通过-1操作来计数里面1的个数

简单一句话:就是把补码变成无符号数

具体解释:http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html

写题时间时长:

1hou

原文地址:https://www.cnblogs.com/captain-dl/p/10671132.html