美文网首页
求一个数二进制表示下1的个数

求一个数二进制表示下1的个数

作者: 一条路上的咸鱼 | 来源:发表于2018-10-24 22:38 被阅读0次

    题目

    给你一个整数a,数出a在二进制表示下1的个数,并输出

    思路

    对于一个二进制整数,将它减一和它本身相与,会把这个整数最右边的1变为零。

    解释

    先讨论正数

    举例说明,比如 这个数字是9
    第一步:
    9的二进制表示为 0000 1001
    8的二进制表示为 0000 1000
    8和9相与的结果二进制表示为 0000 0001 ,表示的数字为 1
    第二步:
    让 1在和 0相与
    1的二进制表示为 0000 0001
    0的二进制表示为 0000 0000
    相与的结果为 0000 0000 表示的数字为0

    我们发现,9的二进制形式里面有2个1,正好相与了两次结果变成了0。因此得出结论:一个数的二进制形式中1的个数等于 将这个数和这个数减一的值相与,将相与的到的数作为新的数,接着和其减一相与,知道结果变为0,中间的相与的次数。

    接下来再来讨论负数

    负数我们在计算时使用了他的补码进行计算,将最高位的符号位取反就可以获得补码,通常我们采用和0xFFFFFFFF相与来得到。这样得到了一个32位的二进制数据。
    例:
    这里以 -9为例
    -9的 原码为 10010000
    -9和0xFFFFFFFF相与的结果为 1111 1111 0110 1111
    发现 补码中0的个数正好就是原来数的二进制形式的1的个数,所以负数的二进制形式的1的个数就是(32 - 补码中1的个数)

    image.png

    python代码示例

    n =9
    if n < 0:
        n & 0xffffffff
    count = 0
    while n :
        count += 1
        n = n & (n-1)
    if n <0:
        print (32-count)
    else:
        print count
    

    相关文章

      网友评论

          本文标题:求一个数二进制表示下1的个数

          本文链接:https://www.haomeiwen.com/subject/vqdftqtx.html