获取Python中二进制数的0和1的个数

pig*_*ack 4 python math binary

我正在尝试解决一个二进制难题,我的策略是将网格转换为 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')
Run Code Online (Sandbox Code Playgroud)

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

use*_*ica 5

您正在寻找的是一个数字的汉明权重。在低级语言中,您可能会在寄存器技巧或库函数中使用漂亮的SIMD来计算它。在 Python 中,最短且最有效的方法是将其转换为二进制字符串并计算'1's:

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

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

def zeros(num, length):
    return length - ones(num)
Run Code Online (Sandbox Code Playgroud)

示范:

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