首页 > 代码库 > 算法学习 - 不申请第三个数交换两个整数的值

算法学习 - 不申请第三个数交换两个整数的值

交换两个数

正常情况我们需要多申请一个变量来交换两个数的值(假设变量为a, b)。例子如下:

int temp = a;
a = b;
b = temp;

这样子就可以了。但这终究是一种需要申请临时变量的方法,总要去想想临时变量的名字。下面主要介绍两种方法。

直接运算

这种办法简单明了,也是我最喜欢使用的办法,因为即使是浮点型也可以用这种办法,继续假设两个变量是ab

a = a+b;
b = a - b;
a = a - b;

这样就交换了!是不是很简单。一下没懂的可以找个例子去试试。

逻辑运算

这种办法也不难理解,就是需要小小的解释一下,先看解决办法,就是使用逻辑运算符的异或的运算符,符号为^

a = a^b;
b = a^b;
a = a^b;

这样子交换是不是有点不太懂?(PS:假如懂了直接看下一个方法)。其实举个例子就懂了。假设a = 3; b= 2;,然后我们看看把这两个变量都转换为二进制是多少。一个int型是4个字节,32bit,那些0我就不写了,我只写前4个bit好了。
a = a^b;

        a=3 = 0  0  1  1  
        b=2 = 0  0  1  0  
        ----------------
              0  0  0  1

现在a的二进制就是0001了,十进制呢就是1。现在执行
b = a^b;

        a=1= 0  0  0  1
        b=2= 0  0  1  0
        ---------------
             0  0  1  1

发现了吧,现在b的二进制是0011了,十进制就是3了,然后如此执行,a = a^b; 之后a就变为2了。

其他方法

其实这里也是大同小异了,就是我们上面是对a b的值进行异或,那么交换的是值,其实我们可以对 a b的地址进行异或,这样就可以直接交换a b的地址了,当然 a b代表的值也就变了。
详细方法我不写了。和上面一样,不过换成地址而已了。

PS:假如有更好的办法,可以评论给我,大家一块学习。

算法学习 - 不申请第三个数交换两个整数的值