python中是否有任何异或位减少操作数或函数?我自己写没有问题,但是如果已经内置了,就没有理由在每个脚本中都写。
r=x&1
for i in xrange(1,63):
r=r^((x>>i)&1)
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.6 微秒,而这需要 3.02 微秒),因为循环取决于数字中的个数(即人口计数)而不是位数。
基本上,这与询问 x 中 1 的数量是偶数还是奇数相同,这与询问 x 的奇偶性相同。
您提供的解决方案确实是天真的解决方案,与其他方法相比效率极低。这是一个针对此问题和其他与位相关的问题提供一些出色解决方案的站点:Bit twiddling hacks。
那里的解决方案在 c 中给出,但将它们“翻译”成 python 应该不难。
如果您不介意使用外部模块,可以使用bitstring
's count()
method。
如果您只想要一个简洁的 Python 表达式,请尝试
r = sum(map(int, format(x, "b"))) & 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. 的答案将以更大的优势获胜。
我不认为这正是你想要的存在。我确实发现了一个您可能会觉得有用的模块:位串模块。
http://code.google.com/p/python-bitstring/
我将建议使用 bitstream 一次提取一个位,然后在 reduce() 函数中使用 operator.xor() 来解决您的问题。但是我认为您无法击败有效地找到奇偶校验的 while 循环。