这个算法是由布尔代数的而来, 在布尔代数中 有几个基本的运算,
与、或、非、异或 ,分别对应C语言中的 &、|、~、^运算符号
其中运算的规则是:
与:
& 0 1
-------------
0 0 0
1 0 1
或:
| 0 1
-------------
0 0 1
1 1 1
非:
~
---------
0 1
1 0
异或:
^ 0 1
-------------
0 0 1
1 1 0
在布尔代数中,单个位的运算等同于该位上相同方向向量的运算,由异或的规则,可以推导到出规则
a ^ a = 0
根据这个原则,我们可以设计出不用中间变量,交换两个变量的算法:
#include <stdio.h> void change(int* a, int* b) { *b = *a ^ *b; *a = *a ^ *b; *b = *a ^ *b; } int main() { int x = 8; int y = 9; printf("before change x=%d, y=%d\n", x, y); change(&x, &y); printf("after change x=%d, y=%d\n", x, y); }
通过这个算法可以节约一个栈变量的开销.