/* * 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)
這樣就互相交換了,是不是很神奇呢?!
沒有留言:
張貼留言