python中是否有任何XOR位减少操作数或函数?我自己编写它没有问题,但如果已经内置了,就没有理由在每个脚本中编写它。
r=x&1
for i in xrange(1,63):
r=r^((x>>i)&1)
答案 0 :(得分:3)
这不回答你的问题,但代码与:
相同def parity(x):
k = 0
d = x
while d != 0:
k = k + 1
d = d & (d - 1)
return k % 2
其优点是不依赖于数字的位长;并且速度更快(例如在2**62
上你需要46.6 usec,这需要3.02 usec)因为循环取决于数量而不是位数的数量(即人口数)。
答案 1 :(得分:2)
基本上,这与询问x中的1的数是偶数还是奇数是一样的,这与询问x的奇偶校验是一样的。
你给出的解决方案确实是天真的解决方案,与其他方法相比效率极差。这是一个网站,为这个和其他与位相关的问题提供了一些出色的解决方案:Bit twiddling hacks c中给出了解决方案,但将它们“转换”为python并不难。
答案 2 :(得分:1)
如果您不介意使用外部模块,可以使用bitstring
's count()
method。
如果您只想要一个简洁的Python表达式,请尝试
r = sum(map(int, format(x, "b"))) & 1
答案 3 :(得分:1)
只是为了好玩,这是@Sven Marnach的另一个版本的答案。
r = sum(ord(ch) for ch in format(x, "b")) & 1
这适用于ASCII,因此也适用于Unicode。它工作的原因是因为'0'的序数值是0x30,它在最低有效位位置有0位;而'1'的序数值是0x31,其中有1位。如果我们只是按位 - 并且使用最低有效位,那么这将与使用int()
将“1”或“0”强制为位值一样有效。
速度快了两倍!但@Dan D.的答案更快。计算xrange(200000)
中所有数字的奇偶性,三次试验中的最佳值:
@Sven Marnach's answer: 1.550 seconds
this answer: 0.605 seconds
@Dan D.'s answer: 0.411 seconds
随着更多的试验(计算的数字越来越多),@ Dan D.的回答将以更大的优势获胜。
答案 4 :(得分:0)
我认为你想要的确切存在。我确实发现了一个你可能会觉得有用的模块:bitstring模块。
http://code.google.com/p/python-bitstring/
我打算建议使用比特流一次一个地拉出一个位,然后在reduce()函数中使用operator.xor()来解决你的问题。但我认为你无法击败有效找到奇偶校验的while循环。