题目:将a 与 b的值互换。程序员
一般咱们的作法是(尤为是在学习阶段):定义一个新的变量,借助它完成交换。代码以下:
int a,b;
a; b;
int t;
t=a; a=b; b=t;
这种算法易于理解,特别适合帮助初学者了解计算机程序的特色,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,通常状况下碰到交换变量值的问题,都应采用此算法(如下称为标准算法)。算法
上面的算法最大的缺点就是须要借助一个临时变量。那么不借助临时变量能够实现交换吗?答案是确定的!学习
1) 算术运算
简单来讲,就是经过普通的+和-运算来实现。代码以下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
经过以上运算,a和b中的值就进行了交换。表面上看起来很简单,可是不容易想到,尤为是在习惯标准算法以后。
它的原理是:把a、b看作数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,而且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),而且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),而且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,可是没有借助临时变量。(如下称为算术算法)开发
该算法还能够这样作:变量
int a,b;原理
a=10;b=12;软件
a=a+b=22;程序
b=a-b=10;数据
a=a-b=12;计算机
两个减操做一个加操做,执行的前后顺序不同,其原理也稍微有些区别,但根本原理是同样滴。
3) 位运算
经过异或运算也能实现变量的交换,这也许是最为神奇的,请看如下代码:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此算法可以实现是由异或运算的特色决定的,经过异或运算可以使数据中的某些位翻转,其余位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理能够获得a=b^a^a=b;轻松完成交换。
以上三个算法均实现了不借助其余变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量至关,地址算法中计算较复杂,却能够很轻松的实现大类型(好比自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也能够实现任意结构的交换)。