不用额外变量交换两个整数的值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011729265/article/details/90720776

题目:int a=10,b=15; 将a / b的值互换。

通常我们的做法是定义一个新的变量,借助它完成交换。代码如下:

      int a,b;

      a=10; b=15;

      int t;

      t=a; a=b; b=t;

问题:如何不用任何额外变量交换两个整数的值?

思路:使用位运算的异或运算,或者使用算数运算

位运算
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:
      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;轻松完成交换。

扫描二维码关注公众号,回复: 6783139 查看本文章

 

算数运算

简单来说,就是通过普通的+和-运算来实现。代码如下:

      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;

 

两个减操作一个加操作,执行的先后顺序不一样,其原理也稍微有些区别。

 

代码如下:

位运算:

void swap(int &a, int &b)

{

   a ^= b;

   b ^= a;

   a ^= b;

}

 

减法运算:

void swap(int &a, int &b)

{

a=b-a;

      b=b-a;

      a=b+a;

}

 

加法运算

void swap(int &a, int &b)

{

      a=a+b;

      b=a-b;

      a=a-b;

}

猜你喜欢

转载自blog.csdn.net/u011729265/article/details/90720776