Python中的XOR交换算法?
我尝试在Python中实现异或交换算法。
x,y= 10,20
x,y,x = x^y,x^y,x^y
print('%s , %s'%(x,y))
输出结果:
30 , 30
我对Python并不陌生,但我无法解释这个输出结果。它应该是20,10
。
到底发生了什么呢?
6 个回答
4
你需要逐行把“算法”抄写下来。
>>> x, y = 10, 20
>>> x = x ^ y; print x, y
30 20
>>> y = x ^ y; print x, y
30 10
>>> x = x ^ y; print x, y
20 10
>>>
你还需要阅读维基百科的剩余部分,里面解释了正确的实现会阻止并行操作,而且这个想法在现代计算机架构上基本上是没什么用的。
11
虽然其他答案提到的最好的方法是直接用 x, y = y, x
来交换两个变量,但如果你不想创建和拆解元组,其实也可以用连续的异或运算来实现交换……只不过必须是连续的,而不是像你现在这样同时进行!
>>> x = 1234
>>> y = 3421
>>> x ^= y
>>> y ^= x
>>> x ^= y
>>> print x
3421
>>> print y
1234
这个异或交换的技巧关键在于要进行三次连续的异或运算,也就是说要一个接着一个地进行——在这个代码片段中有三条独立的 ^=
语句。当然,这样做在实际应用中没有什么意义,但如果你真的想尝试,它在Python中和其他地方一样是有效的;-).
17
首先,创建了一个包含三个 x^y
的元组。然后,这个元组被拆开,分别赋值给 x
、y
和 x
,这就导致这两个 x
都指向了 x^y
的结果。
为了避免麻烦,建议你用更符合Python风格的方法来做:
x, y = y, x