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

2021-07-02 05:37:46 字數 835 閱讀 7532

假設有兩個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了 這種情況是很可能發生的 ...