是否有任何XOR位减少操作数或功能?

时间:2011-09-18 18:53:40

标签: python binary-operators

python中是否有任何XOR位减少操作数或函数?我自己编写它没有问题,但如果已经内置了,就没有理由在每个脚本中编写它。

r=x&1
for i in xrange(1,63):
    r=r^((x>>i)&1)

5 个答案:

答案 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循环。