Python中的XOR交换算法?

3 投票
6 回答
5293 浏览
提问于 2025-04-15 20:28

我尝试在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 的元组。然后,这个元组被拆开,分别赋值给 xyx,这就导致这两个 x 都指向了 x^y 的结果。

为了避免麻烦,建议你用更符合Python风格的方法来做:

x, y = y, x

撰写回答