C 關於使用異或運算交換兩數的值
- 2019 年 11 月 22 日
- 筆記
異或運算可以達到交換兩數的目的,程式碼如下:

但不推薦使用這種方式,附上常用的臨時變數方法對比說明。
臨時變數方法:

對於臨時變數法,每次賦值只要讀取一個變數的值到暫存器,然後再從暫存器寫回到另一個變數中即可,前後涉及兩次記憶體寫入操作;但是對於異或運算操作,每次都需要讀取兩個數據到暫存器中,再進行運算操作,之後把結果寫回到變數中,前後共需要三次記憶體寫入操作。另外一點,異或操作的程式碼可讀性差。
如果使用C語言實現上述兩種方法,並用gcc編譯器編譯,可以使用命令 gcc -S swap.c 查看相應的彙編程式碼,臨時變數法程式碼行數更少,另外使用 gcc 編譯器時,用異或運算交換數組會出錯,參見鏈接。
在不引入臨時變數的基礎上,交換兩數的值還可以使用三次加減法,程式碼如下:

這種方式同樣需要三次記憶體寫入操作,同時程式碼可讀性也較差。
最後附上兩張三種方法編譯後對應彙編程式碼對比圖(平台:Ubuntu14.04,gcc 4.8.4),圖中 swap1.c 文件對應臨時變數法,swap2.c 文件對應加減方法,swap3.c 文件對應異或方法。可以看到,臨時變數法編譯出的彙編程式碼量最少即效率更高,加減法和異或方法的區別僅僅是計算方式不同而已,操作步驟是一致的。
圖1: 臨時變數法和加減法彙編程式碼對比

圖2: 異或方法和加減法彙編程式碼對比
