3 回答

TA貢獻1826條經驗 獲得超6個贊
您可以通過替換來了解它的工作原理:
x1 = x0 xor y0
y2 = x1 xor y0
x2 = x1 xor y2
代,
x1 = x0 xor y0
y2 = (x0 xor y0) xor y0
x2 = (x0 xor y0) xor ((x0 xor y0) xor y0)
因為xor是完全關聯和可交換的:
y2 = x0 xor (y0 xor y0)
x2 = (x0 xor x0) xor (y0 xor y0) xor y0
因為x xor x == 0任何x,
y2 = x0 xor 0
x2 = 0 xor 0 xor y0
而且因為x xor 0 == x任何x,
y2 = x0
x2 = y0
交換完成了。

TA貢獻1786條經驗 獲得超13個贊
其他人已經解釋過,現在我想解釋為什么這是一個好主意,但現在不是。
回到我們擁有簡單的單周期或多周期CPU的那一天,使用這個技巧避免代價高昂的內存解除引用或將寄存器溢出到堆棧是更便宜的。但是,我們現在擁有帶有大量管道的CPU。P4的管道范圍從他們的管道中有20到31個(或左右)階段,讀取和寫入寄存器之間的任何依賴可能導致整個事情停滯。xor交換在A和B之間有一些非常重的依賴關系,它們實際上并不重要,但在實踐中會使管道停頓。停滯的管道會導致代碼路徑變慢,如果在內循環中進行此交換,則移動速度會非常慢。
在一般實踐中,當您使用temp變量進行交換時,編譯器可以確定您真正想要做什么,并且可以將其編譯為單個XCHG指令。使用xor swap使編譯器更難以猜測您的意圖,因此更不可能正確地優化它。更不用說代碼維護等
添加回答
舉報