python - 如何找到恰好有六个 1 和其余 0 的所有 32 位二进制数

标签 python algorithm math binary combinatorics

我可以用蛮力做到这一点,但我希望有巧妙的编码,或者可能是现有的功能,或者我没有意识到的东西......

所以我想要一些数字示例:

00000000001111110000
11111100000000000000
01010101010100000000
10101010101000000000
00100100100100100100

完整的排列。除了只有六个 1 的结果。不多。不低于。 64 或 32 位将是理想的。 16 位(如果提供答案)。

最佳答案

我想你在这里需要的是使用 itertools模块。

糟糕的解决方案

但是你需要小心,例如,使用类似 permutations 的东西只适用于非常小的输入。即:

像下面这样的东西会给你一个二进制表示:

>>> ["".join(v) for v in set(itertools.permutations(["1"]*2+["0"]*3))]
['11000', '01001', '00101', '00011', '10010', '01100', '01010', '10001', '00110', '10100']

然后只是获取这些数字的十进制表示:

>>> [int("".join(v), 16) for v in set(itertools.permutations(["1"]*2+["0"]*3))]
[69632, 4097, 257, 17, 65552, 4352, 4112, 65537, 272, 65792]

如果你想要包含 6 个 1 和 26 个 0 的 32 位,你可以使用:

>>> [int("".join(v), 16) for v in set(itertools.permutations(["1"]*6+["0"]*26))]

但是这个计算需要一台 super 计算机来处理 (32!= 263130836933693530167218012160000000 )

体面的解决方案

所以一个更聪明的方法是使用 combinations ,也许是这样的:

import itertools

num_bits = 32
num_ones = 6
lst = [
    f"{sum([2**vv for vv in v]):b}".zfill(num_bits)
    for v in list(itertools.combinations(range(num_bits), num_ones))
]
print(len(lst))

这会告诉我们在 32 位数字的整个范围内有 906192 个数字,其中有 6 个 1。

学分:

此答案归功于@Mark Dickinson,他指出使用 permutations 是不可行的,并建议使用 combinations

关于python - 如何找到恰好有六个 1 和其余 0 的所有 32 位二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55676314/

相关文章:

c++ - 修改递归子集求和算法

javascript - 将缓动纳入基于时间的移动

python - 在 Python 中划分

java - 在 Java 中使用递归的影响

Python Pillow v2.6.0 paletted PNG (256) 如何添加 Alpha channel ?

python - 旋转图像会增加其尺寸?

javascript - 在 Javascript 中找到距离半圆中心 n% 的点?

javascript - 数字的乘积、总和和数字

python - 在传入设置时使用 shell 脚本运行自定义 django manage.py 命令

python - 如何在 sqlalchemy 查询中返回相关实体的计数