不借助第三个变量实现两个值的交换
交换两个数最常用的是借助第三个变量来实现,或者借助其它数据结构(其实也就是借助第三方来实现暂存数据)。那么如何不借助第三方实现交换两个数据呢?
方法一:利用两个值的差值来实现
原理:假如a = 5, b = 7;那么ab大小差2。已知一个变量的值,通过与另外一个变量的差值就可以知道另外的值。
- 可以先让a暂存与b的差值,a = b - a;a = 2;
- 然后将a的值赋值给b,b = b - a;b = 5;
- 最后在利用差值将b赋值给a;a = b + a;a = 7;
template <typename T>
void swapTwo(T &a, T &b)
{
a = b - a;
b = b - a;
a = b + a;
}
方法二:位运算异或
原理:对与整型值,都是二进制值,比如5是0101,7 是0111。5和7异或,只有在两个比较的位不同时其结果是1,否则结果为0,所以5^7 => 0101 ^ 0111 = 0010。对于异或有个特点就是,一个数连续异或两个相同的数那么值等于它本身。5 ^ 7 ^ 7 => 0010 ^ 0111 = 0101 = 5。
template <typename T>
void swapTwo(T &a, T &b)
{
a = a ^ b;
b = a ^ b; // 等价于b = a ^ b ^ b = a
a = a ^ b; // 等价于a = a ^ b ^ a = b
}