优雅的交换两个数的值

前言

这是我在一个晚修时无聊时想到的,我称他为保留数据式交换(没什么技术含量,看看思路即可)
额,写得有点乱,将就看看吧

解释

就是把两个数通过特定的方法结合起来,然后我们可以通过其中一个值求出另一个值

方法:

1.+
2.-
3.*
4./
当然最好的还是 ^
注意:像 % & | 这样会舍去数据的无法进行交换

代码

1.+

//a=1,b=2
a+=b;//a=a+b=1+2=3
b=a-b;//b=a-b=3-2=1
a-=b;//a=a-b=3-1=2

2.-

//a=1,b=2
a-=b;//a=a-b=1-2=-1
b+=a;//b=a+b=-1+2=1
a=b-a;//a=b-a=1-(-1)=2

3.*

//a=2,b=3
a*=b;//a=a*b=2*3=6
b=a/b;//b=a/b=6/3=2
a/=b;//a=a/b=6/2=3

4./

//a=2.0,b=3.0  这里要用double或float
a/=b;//a=a/b=2/3
b*=a;//b=a*b=2/3*3.0=2.0
a=b/a;//a=b/a=2.0/(2/3)=3.0

5.^ 压轴戏(永远不丢失数据)
注:用括号里面的为二进制数

//a=1=(01),b=2=(10)
a^=b;//a=a^b=(01)^(10)=11
b=a^b;//b=a^b=(11)^(10)=01
a^=b;//a=a^b=(11)^(01)=10
//此时a=(10)=2,b=(01)=1

这也是我认为的最优的解
原因:1.它在二进制中转换,而其他的都是在十进制的基础完成,理论来说会一点(因为不考虑进位等)
2.他不会爆 如果两个十进制相加(加减乘除都可能出现这种情况)的话可能会爆出范围,要用高精

Tags: