前面一小节我们引入一个简单的中间变量 k 进行两个数值交换。这里用一个类似的方法,比如利用指针值交换实现:
#include "stdio.h" void swap(int *x, int *y) { int t; t=*x; *x=*y; *y=t; } int main() { int a=1,b=2; swap(&a,&b); printf("a=%d,b=%d",a,b); return 0; }
如果再加个限制,不使用额外的变量,可以这样:
#include "stdio.h" void swap(int *x,int *y) { *x = *x + *y; *y = *x - *y; *x = *x - *y; } int main() { int a=1,b=2; swap(&a,&b); printf("a=%d,b=%d",a,b); return 0; }
也可以巧妙地使用位运算来实现:
#include "stdio.h" void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } int main() { int a=1,b=2; swap(&a,&b); printf("a=%d,b=%d",a,b); return 0; }
位运算的原理是什么呢?下面直接拿例子来看一下就很清楚了:
假如 a = 5, b = 6:
a = 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
b = 6 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
第一次异或处理之后:
a | 0 | 0 | 0 | 0 | 0 | 0 (*) | 1 (*) | 1 |
b | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
第二次异或处理之后:
a | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
b | 0 | 0 | 0 | 0 | 0 | 1 | 0 (*) | 1 (*) |
第三次异或处理之后:数值已经互换过来了。
a | 0 | 0 | 0 | 0 | 0 | 1 (*) | 1 | 0 (*) |
b | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
这里就列举这么三个常见的两数交换方法。
现代魔法 推荐于 2013-02-27 10:23