gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:58:17 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com