剑指 二进制1的个数

调整数组顺序使奇数位于偶数前面

http://www.nowcoder.com/questionTerminal/ef1f53ef31ca408cada5093c8780f44b

通过&确定二进制最右位是否为1,然后再右移进位,这样循环判断32位中有多少为1。&表示整数与0……01(31个0)进行与计算。>>1表示二进制向右移1位,

class Solution:
    def NumberOf1(self, n):
        # write code here
        count=0
        for i in range(32):
            if n&1==1:
                count+=1
            n=n>>1
        return count

通过n-1,使得n的二进制最右边的1变为0,最右边1后面的所有0(如果有的话)变为1,这样与原来的n进行与操作,就得到了将最右边1以及之后的数字都变成0的结果,这样的循环操作,条件n!=0就可以直到对应二进制中到底有多少位1。
其中需要注意的是,python中对于负数的二进制表示是在前面加负号,而对于十六进制的负数,他的负数刚好是其二进制的补码表示。所以如果遇到一个负数,先将他和0xffffffff进行与操作,将其也变成十六进制,这样就可以得到他的二进制补码表示。
python 中没有位数这个概念。
也可以理解成 n&0xffffffff得到一个整数,而这个整数二进制中含1个数与其负数补码形式含1个数相同。
总之 负数 n&0xffffffff就是求其补码。
https://blog.csdn.net/u010005281/article/details/79851154
https://www.zhihu.com/question/314455297

class Solution:
    def NumberOf1(self, n):
        # write code here
        count=1
        if n<0:
            n=n&0xffffffff
        if n==0:
            return 0
        while n&(n-1)!=0:
            count+=1
            n=n&(n-1)
        return count
全部评论

相关推荐

LemontreeN:有的兄弟有的我今天一天面了五场,4个二面一个hr面
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
06-04 18:37
门头沟学院 Java
勇敢的ssr求对象:前面看的有点奔溃,看到只有你是真玩啊,忍不住笑出了声😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务