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
例如将一个数组中的元素首尾对调的时,使用下面的函数
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