读书人

不要中间变量交换两个变量的值

发布时间: 2012-12-23 11:28:15 作者: rapoo

不用中间变量交换两个变量的值

这个算法是由布尔代数的而来, 在布尔代数中 有几个基本的运算,

?

与、或、非、异或 ?,分别对应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); }

?

通过这个算法可以节约一个栈变量的开销.

?

?

?

?

读书人网 >编程

热点推荐