【问题标题】:count number of ones in a given integer计算给定整数中的个数
【发布时间】:2013-03-10 13:34:38
【问题描述】:

如何计算给定整数的二进制表示中的个数。

假设给你一个数字20,二进制是10100,所以个数是2。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    您要查找的是Hamming weight,有很多算法可以做到这一点。这是另一个直截了当的:

    def ones(n):
        w = 0
        while (n):
            w += 1
            n &= n - 1
        return w
    

    【讨论】:

    【解决方案2】:

    使用很棒的 collections 模块。

    >>> from collections import Counter
    >>> binary = bin(20)[2:]
    >>> Counter(binary)
    Counter({'0': 3, '1': 2})
    

    或者你可以使用内置函数count()

    >>> binary = bin(20)[2:]
    >>> binary.count('1')
    2
    

    甚至:

    >>> sum(1 for i in bin(20)[2:] if i == '1')
    2
    

    但最后一个解决方案比使用 count()

    【讨论】:

    • 没有理由为此使用Counter
    • 即使是制作Counter 的人也没有用它来解决这个问题;)
    • @jamylak 它仍然是一个解决方案:)
    • 是的,但简单胜于复杂!另外我之前没有开玩笑,贡献收藏模块的 Raymond Hettinger 回答了这个问题
    • 所以我在将近五年后回顾这件事,我想评论一下应该使用@Cairnarvon 下面的解决方案而不是我的解决方案。速度更快,不依赖任何模块,直接
    【解决方案3】:
    >>> num = 20
    >>> bin(num)[2:].count('1')
    2
    

    【讨论】:

    • 不需要切片,因为0b 前缀不包含任何前缀。
    【解决方案4】:

    使这种致盲快速的常用方法是使用查找表:

    table = [bin(i)[2:].count('1') for i in range(256)]
    
    def pop_count(n):
       cnt = 0
       while n > 0:
         cnt += table[n & 256]
         n >>= 8
       return cnt
    

    在 Python 中,任何使用 binlist.count 的解决方案都会更快,但如果你想用汇编程序编写它,这很好。

    【讨论】:

    • 如果您使用的是汇编,n & 255 将比n % 256 快得多。
    • 你的代码有错别字,你写的是n & 256而不是n & 255
    【解决方案5】:

    str.count 方法和 bin 函数可以轻松解决这个小挑战:

    >>> def ones(x):
            "Count the number of ones in an integer's binary representation"
            return bin(x).count('1')
    
    >>> ones(20)
    2
    

    【讨论】:

      【解决方案6】:

      您可以使用位移>> 和按位和& 来检查最低有效位,如下所示:

      def count_ones(x):
          result = 0
          while x > 0:
              result += x & 1
              x = x >> 1
          return result
      

      这是通过将位右移直到值变为零来实现的,同时计算最低有效位为 1 的次数。

      【讨论】:

        【解决方案7】:

        int 类型从 python 3.10a 开始有一个新方法int.bit_count(),返回给定整数的二进制扩展中的个数,也称为人口计数,如下所示:

        n = 20
        bin(n)
        '0b10100'
        

        n.bit_count() 返回 2,因为它在二进制表示中有 2 个。

        【讨论】:

          【解决方案8】:

          我是一名新的编码员,我发现这个逻辑很简单。新手可能更容易理解。

          def onesInDecimal(n):
            count = 0
            while(n!=0):
              if (n%2!=0):
                  count = count+1
                  n = n-1
                  n = n/2
              else:
                  n = n/2
            return count
          

          【讨论】:

            【解决方案9】:

            对于需要快速检查整数x的二进制形式是否只有一个1(因此是2的幂)的特殊情况,可以使用此检查:

            if x == -(x | (-x)):
                ...
            

            表达式-(x | (-x)) 是将x 的二进制表示中除最后一个(最低有效位)之外的所有1 替换为0 时得到的数字。

            例子:

            12 = 1100 二进制

            -12 = ...110100 二进制(有无限个前导 1)

            12 | (-12) = ...111100 二进制(有无限个前导 1)

            -(12 | (-12)) = 100 二进制

            【讨论】:

            • 这个答案更像是一个评论/讨论点而不是一个答案。请考虑将其添加到相关答案中。
            【解决方案10】:

            如果输入的数字是'数字'

            number =20
            len(bin(number)[2:].replace('0',''))
            

            另一种解决方案是

            from collections import Counter
            
            Counter(list(bin(number))[2:])['1']
            

            【讨论】:

            • 您的第一个解决方案就像用大锤打苍蝇一样。您可以使用str.count('1')。如果您使用 Counter,也无需转换为列表
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-20
            • 2010-09-11
            • 1970-01-01
            • 1970-01-01
            • 2014-12-11
            • 2016-05-06
            相关资源
            最近更新 更多