交换两个数的三种方法原理解析

问题:交换以下两个数:

int m = 12;
int n = 5;

方法一

// 方法一:提供一个临时变量。
int temp = m;
m = n;
n = temp;

原理:使用第三个变量暂存其中一个值,以便交换。就像要交换两杯水,先把其中一杯水倒到第三个杯子。这是最容易想到的方法,但需要额外引入一个变量。

方法二

// 方法二:使用加减法。当m和n较大时,有可能出现精度损失
m = m + n;//m = 12 + 5;
n = m - n;//n = 17 - 5;
m = m - n;//m = 17 - 12;

原理:先将m变成两个数的和,这样就和n共同存储了原来两个数的信息,通过减法将n变成原来m,此时m和n仍然可以完整保存两个数的信息,再通过减法将m变回原来的m。这个方法不容易想到,并且当m和n较大时,有可能出现精度损失。

方法三

// 方法三:使用异或。优点:没有上面两种方法的缺点。 缺点:难!
m = m ^ n;
n = m ^ n; // (m ^ n) ^ n == m
m = m ^ n; // (m ^ n) ^ m == n

原理:使用异或的对称特性,与同一个数进行两次异或运算之后还是原来的数。这个方法原理类似于方法二,不需要提供第三个变量,但由于使用的是异或而不是加法,所以不会出现精度损失。

猜你喜欢

转载自blog.csdn.net/Runner1st/article/details/86522320