C 關於使用異或運算交換兩數的值
異或運算可以達到交換兩數的目的,代碼如下:
void swap(int &a, int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
但不推薦使用這種方式,附上常用的臨時變數方法對比說明。
臨時變數方法:
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
對於臨時變數法,每次賦值只要讀取一個變數的值到寄存器,然後再從寄存器寫回到另一個變數中即可,前後涉及兩次內存寫入操作;但是對於異或運算操作,每次都需要讀取兩個數據到寄存器中,再進行運算操作,之後把結果寫回到變數中,前後共需要三次內存寫入操作。另外一點,異或操作的代碼可讀性差。
如果使用C語言實現上述兩種方法,並用gcc編譯器編譯,可以使用命令gcc -S swap.c 查看相應的彙編代碼,臨時變數法代碼行數更少,另外使用 gcc 編譯器時,用異或運算交換數組會出錯,參見鏈接。
在不引入臨時變數的基礎上,交換兩數的值還可以使用三次加減法,代碼如下:
void swap(int &a, int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
這種方式同樣需要三次內存寫入操作,同時代碼可讀性也較差。
最後附上兩張三種方法編譯後對應彙編代碼對比圖(平台:Ubuntu14.04,gcc 4.8.4),圖中 swap1.c 文件對應臨時變數法,swap2.c 文件對應加減方法,swap3.c 文件對應異或方法。可以看到,臨時變數法編譯出的彙編代碼量最少即效率更高,加減法和異或方法的區別僅僅是計算方式不同而已,操作步驟是一致的。
圖1: 臨時變數法和加減法彙編代碼對比,點擊圖片查看大圖。
圖2: 異或方法和加減法彙編代碼對比,點擊圖片查看大圖。


※一個製作Web圖案的組件css-doodle
※Python爬蟲之基本原理
TAG:程序員小新人學習 |