當前位置:
首頁 > 知識 > C 關於使用異或運算交換兩數的值

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: 臨時變數法和加減法彙編代碼對比,點擊圖片查看大圖。

C 關於使用異或運算交換兩數的值

圖2: 異或方法和加減法彙編代碼對比,點擊圖片查看大圖。

C 關於使用異或運算交換兩數的值

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

一個製作Web圖案的組件css-doodle
Python爬蟲之基本原理

TAG:程序員小新人學習 |