用異或交換兩個整數的陷阱

2021-06-18 20:53:35 字數 923 閱讀 6276

前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面:

void exchange(

int&a,

int&b)

然而,這裡面卻存在著乙個非常隱蔽的陷阱。

通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang(&a[i], &b[j]), 這兒如果i==j了(這種情況是很可能發生的),得到的結果就並非我們所期望的。

void main();

exchange(

a[0]

,a[1]

); //交換a[0]和a[1]的值

printf(

"1---a[0]=%d a[1]=%d\n"

, a[0]

, a[1]);

exchange(

a[0]

,a[0]

); //將a[0]與自己進行交換

printf(

"2---a[0]=%d a[1]=%d\n"

, a[0]

, a[1]);

}  上面那段測試**的輸出是:

1---a[0]=2 a[1]=1

2---a[0]=0 a[1]=1

很意外吧,第一次的交換正確的執行了,但是第二次呼叫exchange的時候卻將a[0]置為了0. 仔細分析,不難發現,這正是我們在exchange裡面用異或實現交換所造成的。如果輸入a和b是同乙個數,exchange裡面**相當於:

a ^= a;

a ^= a;

a ^= a;

成了a做了3次於自己的異或,其結果當然是0了。

既然這樣,我們就不能夠在任何使用交換的地方採用異或了,即使要用,也一定要在交換之前判斷兩個數是否已經相等了,如下:

void exchange(

int&a,

int&b)

異或交換兩個數

void swap int a,int b 一般我們可以用異或來進行交換兩個數,以前我也不知道會有這個問題,最近在準備考研寫排序的時候,發現自己寫的swap函式在選擇排序的時候會出現個別0。通過查閱大佬們的部落格,發現問題是由於swap在對同乙個物件進行異或的時候,因為同乙個物件的位址是相同的,所以...

按位異或交換兩個變數時的乙個陷阱

假設有兩個int型變數x和y,為了交換二者數值,我們可以借助臨時變數,如下所示 int tmp x x y y tmp 利用異或操作的特性,不使用臨時變數也可以到達交換的目的,如下所示 x x y y x y 即 y x y y x,y的值現在已經成x原來的值了 x x y x的值現在已經成y原來的...

關於通過異或交換兩個元素的值的乙個陷阱

include include using namespace std void swap int a,int b int main int argc,char argv int b swap a 0 a 1 將陣列b中的元素通過異或函式反轉 for int i 0,j 4 i j i j 輸出a,...