方法如下
- 加减法
- 乘除法
- 异或法
学习过程中,我们交换两个数字总要用到第三方变量暂存其中一个变量的值。
做法通常如下:
//第三变量法
int a = 2, b = 3;
int c;
c=a;
a=b;
b=c;
这种方法有溢出的风险,此外还有两种方法——加减法和乘除法。
//加减法
int a=3;
int b=5;
a=a+b;
b=a-b;//b=3
a=a-b;//a=5
//乘除法:可以处理整型和浮点型变量,但存在精度损失问题以及b不能为0的限制
int a=3;
int b=5;
a=a*b;
b=a/b;
a=a/b;
今天看到一个不用c的方法——异或法,在这里做一个小小的笔记。
//异或法 例1:
//适用于整形变量,不适用于浮点型变量
int a=2; //10
int b=3; //11
a=a^b; //01=10^11
b=a^b; //10=01^11
a=a^b; //11=01^10
这里用到了位运算 ^异或 的知识。
异或(XOR)的运算规则是:相同为0, 不同为1(相当于减法)。
可以总结为:数a与数b做异或运算之后成为了数c,数c和数b异或一次可以变回原来的数据a。
公式表示如下:a ^ b ^ b=a; a ^ b ^ a=b
//异或法 例2:
int a=4;//a:0100
int b=5;//b:0101
a=a^b;//0100 ^ 0101=0001,此时a:0001,b 不变 (b:0101)
b=a^b;//0001 ^ 0101=0100,此时a:0001,b:0100(即b的值为4)
a=a^b;//0001 ^ 0100=0101,此时a:0101,b:0100,
//转换二进制为十进制得到a=5,b=4;
数组里也同样适用——
int a[n];
int i; // i < n
a[i]=a[i]^a[0];
a[0]=a[i]^a[0];
a[i]=a[i]^a[0];
异或运算不会产生进位,所以不会造成数据损失,但是这种交换方式阅读性差,可以作为某些题目的非常规解法,用来开拓思路。
实际在大部分编译器上,用第三变量法生成的代码速度好过这种方式。所以还是定义第三方变量比较常用和好用。