前些天在翻阅C语言教材时,偶然瞥见这样一道题:如何在不使用第三个变量的情况下实现两个变量值的交换?当时看到这道题的时候一脸懵逼,想了好久也不知道该怎么办,于是后来去翻阅了习题答案,答案上给出的是算术运算的方法,就是利用代数变换实现值的互换。codes如下:
一、算数运算(几何理解)
#include<iostream>
using namespace std;
int main()
{
int a{3},b{5};
a=b-a;
b=b-a;
a=a+b;
return 0;
}
这个确实很难想到,利用代数关系在运算中完成了交换,后来查阅在论坛上找到了另一个博主关于这个算法的另一种理解——几何方向的理解。首先我们可以将a,b两数看作数轴上的两个点:
如图所示是a,b均为正数的情况,负数算出来取负号结果一致,这里就不再赘述。首先第一步a=b-a,计算出的是a,b之间的距离,将a,b之间的距离赋值给a,此时b的值还未改变,从数轴上可以看出,a到原点的距离可以由b到原点的距离减去a,b之间的距离得到,所以第二步b=b-a,这一步的a表示的是a,b之间的距离,b-a得到的就是a到原点的距离,赋值给b,此时b中存储的就是a的值了。接下来我们来理一下a,b之间的关系,a是原来a,b两点的距离,b是a到原点的距离,b比a大(这里假设),我们还差一步就是得到b的值,自然得到第三步a=a+b,这样一来我们就完成了两个变量值的交换在没有借助第三个变量的情况下。
二、位运算
交换两个变量的值我们还可以利用计算机运算时的特性——位运算,众所周知,计算机在处理数字运算时,总是先将要进行运算的两个数字进行进制转换,转换为对应的二进制数进行相应的运算,而二进制又有其特有的位运算——与、或、非、异或、取反、移位六大运算,在这些运算符中我们关注到异或(~)运算,因为它不仅是一个双目运算符并且它独有的特性:一个数两次与同一个数进行异或运算等于这个数本身,也就是a^b^b=a,b^a^a=b,我们构造算式如下:
#include<iostream>
using namespace std;
int main()
{
int a{3},b{5};
a=a^b;
b=a^b;
a=b^a;
return 0;
}
至此我们也就完成了两个数的交换,同样也没有借助第三个变量。