【问题标题】:Get the the number of zeros and ones of a binary number in Python获取Python中二进制数的零和一的数量
【发布时间】:2013-12-29 08:00:15
【问题描述】:

我正在尝试解决二进制难题,我的策略是将网格转换为 0 和 1,我要确保每一行都有相同数量的 0 和 1。

有没有什么方法可以在不遍历数字的情况下计算一个数字有多少个 1 和 0?

我目前正在做的是:

def binary(num, length=4):
    return format(num, '#0{}b'.format(length + 2)).replace('0b', '')

n = binary(112, 8)
// '01110000'
and then
n.count('0')
n.count('1')

有没有更有效的计算(或数学方法)来做到这一点?

【问题讨论】:

    标签: python math binary


    【解决方案1】:

    您要查找的是数字的Hamming weight。在较低级别的语言中,您可能会使用漂亮的SIMD within a register 技巧或库函数来计算它。在 Python 中,最短且最有效的方法就是将其转换为二进制字符串并计算 '1's:

    def ones(num):
        # Note that bin is a built-in
        return bin(num).count('1')
    

    您可以通过从总位数中减去ones(num) 来获得零的数量。

    def zeros(num, length):
        return length - ones(num)
    

    演示:

    >>> bin(17)
    '0b10001'
    >>> # leading 0b doesn't affect the number of 1s
    >>> ones(17)
    2
    >>> zeros(17, length=6)
    4
    

    【讨论】:

      【解决方案2】:

      如果length 适中(比如少于 20 个),您可以使用列表作为查找表。

      仅当您进行大量查找时才值得生成列表,但在这种情况下似乎您可能会这样做。

      例如。对于 0 计数的 16 位表,请使用此

      zeros = [format(n, '016b').count('0') for n in range(1<<16)]
      ones = [format(n, '016b').count('1') for n in range(1<<16)]
      

      在这台计算机上生成 20 位仍然需要不到一秒钟的时间

      编辑:这似乎稍微快了一点:

      zeros = [20 - bin(n).count('1') for n in range(1<<20)]
      ones = [bin(n).count('1') for n in range(1<<20)]
      

      【讨论】:

      • 你能解释一下范围(1
      • 你不想从 0,20 开始吗​​?
      • range(1&lt;&lt;4) 生成所有 4 位数字 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 等等
      • 对不起,我现在看到了;)
      • 不,我想生成1048576项目的列表
      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2014-04-16
      • 2010-12-04
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多