Python 是否有任何异或位缩减操作数或函数?

Python 是否有任何异或位缩减操作数或函数?,python,binary-operators,Python,Binary Operators,python中是否有任何异或位缩减操作数或函数?我自己写没有问题,但是如果已经有内置的脚本,就没有理由在每个脚本中都写 r=x&1 for i in xrange(1,63): r=r^((x>>i)&1) 这不能回答您的问题,但代码与以下代码相同: def parity(x): k = 0 d = x while d != 0: k = k + 1 d = d & (d - 1) re

python中是否有任何异或位缩减操作数或函数?我自己写没有问题,但是如果已经有内置的脚本,就没有理由在每个脚本中都写

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

这不能回答您的问题,但代码与以下代码相同:

def parity(x):
    k = 0
    d = x
    while d != 0:
        k = k + 1
        d = d & (d - 1)
    return k % 2

其优点是不依赖于数字的位长度;而且速度更快(例如,在
2**62上,你的循环需要46.6usec,这需要3.02usec),因为循环取决于数字中的一个数(即总体计数),而不是位数。

基本上,这与询问x中1的个数是偶数还是奇数相同,这与询问x的奇偶性相同

您给出的解决方案确实是幼稚的解决方案,与其他方法相比效率极低。以下是一个网站,提供了一些解决此问题和其他位相关问题的优秀解决方案:。

这里的解决方案是用c语言给出的,但将它们“翻译”成python应该不难。

如果您不介意使用外部模块,可以使用

如果您只是想要一个简洁的Python表达式,请尝试

r = sum(map(int, format(x, "b"))) & 1

我认为你想要的并不存在。我确实发现了一个你可能会觉得有用的模块:位字符串模块


我打算建议使用bitstream一次提取一个位,然后在reduce()函数中使用operator.xor()来解决您的问题。但我认为你无法有效地克服while循环,它能找到平价。

只是为了好玩,这里是@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的答案:1.550秒
这个答案是:0.605秒
@丹·D.的回答:0.411秒

随着更多的试验(需要计算更多的数字),@Dan D.的答案将以更大的优势获胜。

这会有帮助吗?你描述了如何对位求和,但他问如何对位进行异或运算。事实上,该代码与我的代码和运算做的事情相同,但它很可怕;是的,那会有用的。套用达西勋爵的话来说,“恐怖”这个词可能太强了,但似乎没有其他词足够强大所以没有内置函数。但感谢您提供更好的解决方案。