两个变量的值交换的多种方法
2016-09-01 20:48
239 查看
在我的博客“函数参数的传递”(博客地址:http://blog.csdn.net/wxbmelisky/article/details/50833787)一文中谈到过将两个变量的值进行交换的
swap 函数实现,它们分别是通过指针和引用并使用中间变量来实现的,这里再把代码贴一下。
通过指针来实现:
通过引用来实现:
1. 使用加减运算:
先给出代码入下:
下面再来分析它为什么能够达到交换的目的:首先 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. 使用按位异或运算:
同样先给出代码:
运行结果同样也是正确的:
下面来分析:
首先要弄明白按位异或的概念,按位异或运算符“^”是将参与运算的两个数对应的二进制位相异或(异或就是对应的二进制位相同则结果为 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 函数实现,它们分别是通过指针和引用并使用中间变量来实现的,这里再把代码贴一下。
通过指针来实现:
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 原先的值。
使用按位异或运算来来实现两个数的交换不会出现数据溢出的情况,所以推荐使用按位异或运算的方法而不使用加减运算的方法。
相关文章推荐
- 请自己实现两个整数变量的交换(多种方法)
- 两个变量交换的多种方法(Java)
- 交换两个变量的多种方法
- 交换两个变量的值的多种方法
- 交换两个变量的值(多种方法)
- C语言之多种方法交换两个变量的值
- 交换两个变量中的值(三种方法)
- Java交换两个变量的值的三种方法
- 一种不使用中间变量交换两个变量的方法
- 不用第三个变量交换两个参数值得5种方法
- 算法竞赛_交换两个变量(3种方法)
- 〔面试题〕无需额外变量交换两个变量的方法
- 笔试面试题二:Java中交换两个变量的值,你能想到几种方法?
- 不使用第三方变量交换两个变量值的三种方法
- 交换两个变量的三种方法
- 求砖拍:绝对深入剖析各种方法实现两个变量的交换
- 用传地址方法交换两个变量的值
- 不用中间变量,交换两个变量的值的方法
- 如何通过方法调用交换两个变量的值
- 【陷阱】你能用几种方法交换两个变量的值?