/*
* File Name: SwapTwoNumber.c
* Author: MH
* Since 2012/09/02
* Toolkit: Dev C++
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int x=1, y=2, z;
printf("before exchange:\n");
printf("x=%d, y=%d\n\n", x, y);
z=x;
x=y;
y=z;
printf("after exchange:\n");
printf("x=%d, y=%d\n\n", x, y);
system("PAUSE");
return 0;
}
不過因為 XOR 具可逆性的關係,因此用兩個變數即可,方法如下:
/*
* File Name: SwapTwoNumber.c
* Author: MH
* Since 2012/09/02
* Toolkit: Dev C++
*/
#include <stdio.h>
#include <stdlib.h>
#define swap(x, y) (x^=y, y^=x, x^=y) // or swap(x, y) (x^=y^=x^=y)
int main(int argc, char *argv[]){
int x=1, y=2;
printf("before exchange:\n");
printf("x=%d, y=%d\n\n", x, y);
swap(x, y);
printf("after exchange:\n");
printf("x=%d, y=%d\n\n", x, y);
system("PAUSE");
return 0;
}
XOR 的 truth table
x y|x XOR y
---+-------
0 0| 0 → 意思就是 x XOR x = 0 或 y XOR y = 0
0 1| 1
1 0| 1
1 1| 0 → 意思就是 x XOR x = 0 或 y XOR y = 0
因此
x = x XOR y(即x^=y)
y = y XOR x(即y^=x)
上面的式子意即
y = y XOR (x XOR y)
= x(因為 y XOR y = 0)
所以此時 x 為 x XOR y,y 裡面是存 x,而最後的式子即是將
x = x XOR y(即x^=y)
= x XOR (x XOR y)
= y(因為 x XOR x = 0)
這樣就互相交換了,是不是很神奇呢?!
沒有留言:
張貼留言