`
tuhaitao
  • 浏览: 375238 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

 

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

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics