您的位置:首页 > 编程语言 > C语言/C++

两个变量的值交换的多种方法

2016-09-01 20:48 239 查看
在我的博客“函数参数的传递”(博客地址:http://blog.csdn.net/wxbmelisky/article/details/50833787)一文中谈到过将两个变量的值进行交换的
swap 函数实现,它们分别是通过指针和引用并使用中间变量来实现的,这里再把代码贴一下。

通过指针来实现:

void swap(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}


通过引用来实现:

void swap(int &x, int &y)
{
int t = x;
x = y;
y = t;
}
当然上面两种方法是很好也是很好理解很容易想到的方法,下面再介绍两种不需要使用中间变量的方法。

1. 使用加减运算:

先给出代码入下:
#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}

int main()
{
int a = 3, b = 6;
cout << "a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
运行结果如下:



下面再来分析它为什么能够达到交换的目的:首先 a = a + b 使得 a 值变为 a 与 b 的和,然后 a - b 的值就变成原先 a 的值了,赋给 b 从而使得 b 的值变为原先 a 的值,再接着 a - b 是原先 a 与 b 的和减去原先 a 的值即是原先 b 的值,再赋给 a 从而使得 a 与 b 的值实现交换。

但这样简单的加减运算有一点不好,就是在做 a + b 和 a - b 时可能会导致数据溢出。

2. 使用按位异或运算:

同样先给出代码:
#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
a ^= b;
b ^= a;
a ^= b;
}

int main()
{
int a = 3, b = 6;
cout << "a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}


运行结果同样也是正确的:



下面来分析:

首先要弄明白按位异或的概念,按位异或运算符“^”是将参与运算的两个数对应的二进制位相异或(异或就是对应的二进制位相同则结果为 0,对应二进制位不同则结果为 1,即 0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^1 = 0)。两个相同的数进行按位异或运算后得到的数的二进制位全是 0,而任何一个数与 0 进行按位与运算的结果都不变,再根据结合律和交换律可以得到一个很重要的规则:a ^ b ^ a = b。

由 a ^= b 得 a 的值变为了 a ^ b,再由 b ^= a 得到 b = b ^ (a ^ b) = a,从而 b 的值变为了 a 原先的值,最后由 a ^= b 得到 a = (a ^ b) ^ a = b,从而 a 的值变为了 b 原先的值。

使用按位异或运算来来实现两个数的交换不会出现数据溢出的情况,所以推荐使用按位异或运算的方法而不使用加减运算的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swap 数值交换 异或 c++ c