假設有兩個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原來的值了
下面程式實現陣列的反轉功能,即如果陣列原來為 1 、2、3、 4 、5 ,
反轉後則成為5、4、3、2、1。
下面的程式能否正確實現該功能:
#include
void inplace_swap(int
*x, int
*y)
void reverse_array(int a, int cnt)
int main(void)
; int i = 0;
reverse_array(a,5);
for(; i <5; i++)
printf("%d\t", a[i]);
printf("\n");
return
0;}
輸出結果不是5、4、3、2、1,而是5 、4、0、2、1。why?
問題出在inplace_swap(&a[2], &a[2]),該函式執行step 1後, a[2]的數值被改寫成了0,
即此時*x = *y = 0了。
使用異或運算交換兩個變數的危險
我們知道,在排序演算法中經常會需要交換序列中的兩個變數,常見有兩種方法 1.借助第三個臨時變數 交換 int temp array i array i array index array index temp 2.借助異或運算的特性 array i array i array index array...
關於通過異或交換兩個元素的值的乙個陷阱
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,...
用異或交換兩個整數的陷阱
前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。如下面 void exchange int a,int b 然而,這裡面卻存在著乙個非常隱蔽的陷阱。通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang a i b j 這兒如果i j了 這種情況是很可能發生的 ...