void inplace_swap(int *x, int *y) { *y = *x ^ *y; //Step 1 *x = *x ^ *y; //Step 2 *y = *x ^ *y; //Step 3 } int main() { int num1 = 100; int num2 = 200; inplace_swap(&num1, &num2); printf("num1=%d\nnum2=%d\n", num1, num2); return 0; }
相比使用一個局部變量來交換兩個變量的值,這種方法並無性能上的優點,只是一種對位運算的練習。數組
一個數與它自己異或,結果爲0。假設*x = a;*y = b;函數
*x |
*y |
|
Step0 |
a |
b |
Step1 |
a |
a ^ b |
Step2 | a ^ a ^ b ( = b) |
a ^ b |
Step3 | b |
a ^ b ^ b ( = a) |
不過,須要注意,*x與*y指向同一個位置時,*x與*y指向的數變爲0性能
例如將一個數組中的元素首尾對調的時,使用下面的函數spa
void reverse_array(int a[], int cnt) { int first, last; for (first = 0, last = cnt - 1; first <= last; first++, last--) { inplace_swap(&a[first], &a[last]); } }
若是數組長度爲奇數是,中間的數會變成0
code