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

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


咨詢
建站咨詢
