1void inplace_swap(int *x, int *y) 2{ 3 *y = *x ^ *y; //Step 1 4 *x = *x ^ *y; //Step 2 5 *y = *x ^ *y; //Step 3 6} 7 8int main() 9{ 10 int num1 = 100; 11 int num2 = 200; 12 inplace_swap(&num1, &num2); 13 printf("num1=%d\nnum2=%d\n", num1, num2); 14 return 0; 15}
相比使用一个局部变量来交换两个变量的值,这种方法并没有性能上的优势,只是一种对位运算的练习。
一个数与它本身异或,结果为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
例如将一个数组中的元素首尾对调的时,使用下面的函数
1 void reverse_array(int a[], int cnt) 2 { 3 int first, last; 4 for (first = 0, last = cnt - 1; first <= last; first++, last--) 5 { 6 inplace_swap(&a[first], &a[last]); 7 } 8 }
如果数组长度为奇数是,中间的数会变成0