【发布时间】:2015-07-21 09:37:37
【问题描述】:
编辑:问题已解决,不过请注意下面的代码,哈哈,我从一开始就有一些概念上的错误。
我尝试计算各种 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
我做错了什么?我将如何解决这个问题?我无法想象它太复杂,但经过数小时的搜索、阅读和实验,我觉得我一定是遗漏了一些明显的东西。任何帮助将不胜感激。
【问题讨论】:
-
你为什么要
data[3:]?您只想从bin表示中去除前两个 字符,而不是前三个。但实际上,为什么还要创建带有0b的bin表示只是为了实现它们?如果你想使用字符串,为什么不format(n, 'b')? -
无论如何,无论你从
((1 << 32) + int(num)) & -5)得到的“C 位旋转技巧”列表,(a) 它在 Python 中都不起作用,因为 Python 具有任意长度的整数,而不是固定位-size ints,(b)你复制错了,(c)它可能不会比在 Python 中以明显的方式更快,即使是这样,两个版本对于紧凑的内部来说都太慢了循环,而且对于其他任何事情都足够快,所以谁在乎呢?
标签: python python-3.x bit-manipulation