gpt4 book ai didi

python - 计算 32 位整数列表中的非零位

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:34 31 4
gpt4 key购买 nike

编辑:问题已解决,不过请注意下面的代码,哈哈,我从一开始就在概念上犯了一些错误。

我尝试计算各种 32 位整数中的非零位的时间比我愿意承认的要长,但似乎总是有点偏差。

因此,例如,数字的正确数量的非零位:

13676 9190872 136669 -17621 -1631 -183 15570 0 495 468656377 -1340216 -91

会是:

8 12 10 26 25 27 8 0 8 18

但是,无论我尝试什么,我总是会在至少几个数字(尤其是负数)上偏离几位数。

目前我正在使用:

def bitCount():
numbers = input().split()
answer = []
for num in numbers:
data = bin(((1 << 32) + int(num)) & -5)
bitCount = 0
for char in data[3:]:
if char == '1':
bitCount += 1
answer.append(str(bitCount))
print(' '.join(answer))
bitCount()

上面的一组数字生成:7 12 9 25 24 26 8 0 7 18 19 26

我做错了什么?我将如何解决这个问题?我无法想象它太复杂了,但经过数小时的搜索、阅读和试验后,我觉得我一定是遗漏了一些明显的东西。任何帮助将不胜感激。

最佳答案

您的整个方法在 Python 中没有意义。

数量1 -17621 中的位,又名 -100010011010101 二进制,是 7。如果你期望 26,你不是在要求 1 的数量。数字中的位,您要求的是 1 的数量解释为 C 32 位无符号整数的 C 32 位 2 的补码有符号整数表示中的位。如果你想在 Python 中使用它,你必须明确地要求它。例如,您可以使用 num % 0x100000000 .

与此同时,无论您获得了哪些位技巧列表 (1 << 32) + num & -5 假设 C int32 数学而不是实际的整数算术,所以它会再次出错。另外,我很确定你抄错了。另外,没有理由在 Python 中使用这些技巧——很可能它实际上会更慢,而不是更快,但无论哪种方式,它都会太慢,无法在一个紧密的循环中执行无数次,并且快到可以做几次,所以这种挤出最后 5% 的优化在 Python 中比在 C 中毫无意义。 , 使用现代编译器和 CPU...)

并取消初始 1点点滴滴 [3:]再次假设您有一个 32 位表示,这又是错误的。 (这就是为什么您所有的正数都减去 1 的原因——您要去掉第一个 1 位。)

所以,让我们简单点:

answer = []
for num in numbers:
data = int(num) % 0x100000000
bits = format(data, 'b')
answer.append(str(bits.count('1')))
print(' '.join(answer))

注意我使用了 format(data, 'b') ,所以我不必取消 0b在一开始。

或者,如果你想让它更紧凑:

print(' '.join(str(format(int(num)%0x100000000, 'b').count('1')) for num in numbers))

无论哪种方式,您都会得到:

8 12 10 26 25 27 8 0 8 18 20 28

…确实比您的预期输出多了两个数字,但是您的输入也比您的预期输出多了两个数字,所以我认为这是可以预料的。

关于python - 计算 32 位整数列表中的非零位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30158245/

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