不用中间变量交换两个变量的值
这个算法是由布尔代数的而来, 在布尔代数中 有几个基本的运算,
?
与、或、非、异或 ?,分别对应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); }?
通过这个算法可以节约一个栈变量的开销.
?
?
?
?