记得上次跟一朋友讨论关于交换两变量的值而不用中间变量的值的问题时,我没仔细想就告诉他说不能实现,因为作为交换必须得有第三变量。其实,当时只是进入了一个误区,认为交换只能通过移动变量来实现。现在觉得有点不好意思了,毕竟发现自己学得不太踏实而且很不严谨。以下是关于变换两变量(而不用中间变量)的方法,其基本思想就是进行代数或逻辑上的变换和值累加得到。
1.推荐方法:此方法仅用到了加法和减法,效率高,易理解。
(1)函数:
void swap(int &a,int &b)
{
a+=b;
b=a-b;
a=a-b;
}
(2)宏定义:
#define swap(a,b) a+=b;b=a-b;a=a-b;
2.异或方法:此方法效率也高,但是不易理解(要理解它记住异或的特性就是:连续跟同一个数异或两次则得到它本身。
(1)函数定义
void swap(int &a,int &b)
{
a=a^b;
b=a^b; //此式相当于a连续跟b异或两次
a=a^b; //此式相当于b连续跟a异或两次
}
(2)宏定义:
#define swap(a,b) a="a"^b;b=a^b;a=a^b; 或者
#define swap(a,b) a^=b^=a^=b //此式的理解不难,^=从右到左分解即同上式。
3.带乘除的方法:此方法不推荐,因为乘除比较耗时间,物别是除法(计算机组成原理上有讲)。
(1)函数实现
void swap(int &a,int &b)
{
a=a+b;
b="a-2"*b;
a=(a-b)/2;
b="a"+b;
}
(2)宏定义:
#define swap(a,b) a="a"+b;b=a-2*b;a=(a-b)/2;b=a+b;