新聞中心
對于異或運算操作,每次都需要讀取兩個數(shù)據(jù)到寄存器中,再進行運算操作,之后把結(jié)果寫回到變量中,前后共需要三次內(nèi)存寫入操作。

創(chuàng)新互聯(lián)網(wǎng)站建設由有經(jīng)驗的網(wǎng)站設計師、開發(fā)人員和項目經(jīng)理組成的專業(yè)建站團隊,負責網(wǎng)站視覺設計、用戶體驗優(yōu)化、交互設計和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、網(wǎng)站建設、網(wǎng)站制作易于使用并且具有良好的響應性。
異或運算可以達到交換兩數(shù)的目的,代碼如下:
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;
}
對于臨時變量法,每次賦值只要讀取一個變量的值到寄存器,然后再從寄存器寫回到另一個變量中即可,前后涉及兩次內(nèi)存寫入操作;但是對于異或運算操作,每次都需要讀取兩個數(shù)據(jù)到寄存器中,再進行運算操作,之后把結(jié)果寫回到變量中,前后共需要三次內(nèi)存寫入操作。另外一點,異或操作的代碼可讀性差。
如果使用C語言實現(xiàn)上述兩種方法,并用gcc編譯器編譯,可以使用命令 gcc -S swap.c 查看相應的匯編代碼,臨時變量法代碼行數(shù)更少,另外使用 gcc 編譯器時,用異或運算交換數(shù)組會出錯,參見鏈接。
在不引入臨時變量的基礎上,交換兩數(shù)的值還可以使用三次加減法,代碼如下:
void swap(int &a, int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
這種方式同樣需要三次內(nèi)存寫入操作,同時代碼可讀性也較差。
最后附上兩張三種方法編譯后對應匯編代碼對比圖(平臺:Ubuntu14.04,gcc 4.8.4),圖中 swap1.c 文件對應臨時變量法,swap2.c 文件對應加減方法,swap3.c 文件對應異或方法??梢钥吹剑R時變量法編譯出的匯編代碼量最少即效率更高,加減法和異或方法的區(qū)別僅僅是計算方式不同而已,操作步驟是一致的。
圖1: 臨時變量法和加減法匯編代碼對比,點擊圖片查看大圖。
圖2: 異或方法和加減法匯編代碼對比,點擊圖片查看大圖。
分享標題:詳解C異或運算
網(wǎng)頁URL:http://www.dlmjj.cn/article/cosgsoo.html


咨詢
建站咨詢
