昨天在重新学习c语言的时候,看到位运算,然后看到一个有趣的问题,好像以前也看过这个题,就分享一下吧。
两个数的交换,不借助第三个变量空间。
先放代码:
#include <stdio.h>
#define SWAP1(a,b) \
{ \
int temp = a; \
a = b; \
b = temp; \
}
#define SWAP2(a,b) \
{ \
a = a + b; \
b = a - b; \
a = a - b; \
}
#define SWAP3(a,b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}
int main()
{
int a = 1;
int b = 2;
SWAP1(a,b);
SWAP2(a,b);
SWAP3(a,b);
return 0;
}
分析:
交换两个数,在初学C语言的时候,就学习了两个数的交换函数,还借此学习了形参和实参。这里不讨论,直接采用了宏定义。
第一种方法,是我们最容易想到的,借助第三个中间变量,达到交换的目的。
第二种方法,数学中的和差方法,做到了不借助第三个变量,但有一个缺陷,如果整型a,b数很大,相加超过了int,就会发现有问题。
第三种方法,使用位运算中的异或运算,其最根本思想和第二种类似,但避免了第二种方法的缺陷,突然发现位运算有点神奇。但也有不足,只能运用在整型中,而第一个就没这些问题。
所以各有优劣吧。