本文主要罗列了五种ChangeValue的方法
第一种 : 常用的设置临时变量temp;
这种大家应该比较熟悉,因此就不详细解答了。
第二种:加法交换
这里提供两种加法交换的方法:
第一种是先加在减, a=a+b;b=a-b;a=a-b;这种方法在同号的情况下容易发生溢出其实也很容易理解:
第一步:a+b 的值赋予a,
第二步:在把a 的值减去b再赋予b,b就变成了(a+b-b),即a,
第三步:在把a 的值减去a再赋予b,a就变成了((a+b)-a),即a;
需要声明的是第三步等号右边a的值在第一步时变成了a+b(此时仍然是这样,d第二步并没有发生改变),而在第二步b已经变成了a,因此第三步也就相当于a+b-a,就是等于b,整个过程就是这样的步骤!
第二种是先减再加,原理同第一种相差无几,这里就不赘余了!
第三种就是异或交换;
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0,这些法则与加法是相同的,只是不带进位。简而言之,就是不同为0,相同为1,这里的异或运算全都将转化为二进制的运算,比如,4^3,4的二进制为100,5为011,逐位运算为111,结果就是1;说清楚了运算法则,那么再来讲讲交换的原理,这里同样举4^3的例子,首先a=4,b=3,
第一步:a=a^b;a就等于7(即111);
第二步:b=a^b;就发生7^3,就得到4(即100),b就等于4了;
第三步:a=a^b;在第一步时a为7,第二步时b为4,就把7^4赋予a,
也就是a=3;
最后就完成了整个交换算法!
第四种是a=b+(b=a)*0;
说白了这种就是在同一条语句中执行了需要两条语句才能完成的事情,执行该行语句时,从右至左,发生b=a;但是却不返回,与此同时,发生a=b(前半部分);最终完成了整个算法的功能!
需要特别注意的是,在某些非纯面向对象的语言中这是错误的语法,在c#和Java中却是可以完全成功运行的!
第五种是除法交换
这种方法中后者不可以为0,存在较大的漏洞,仅仅列出来供大家参考!
目前并没有过大的研究价值!
这里是是Java中的值交换方法的代码
Java Code
package text20160326;
public class Class11 {
public static int a=1;
public static int b=0;
public boolean Fun( int a, int b)
{
System.out.println("a="+a+" "+"b="+b);
int temp=a;
a=b;
b=temp;
System.out.println("a="+a+" "+"b="+b);
return true;
}
public boolean Fun(int a,int b,int c)
{ //同号的情况下容易内存溢出
System.out.println("a="+a+" "+"b="+b);
a=a+b;
b=a-b;
a=a-b;
System.out.println("a="+a+" "+"b="+b);
return true;
}
public boolean Fun(int a,int b,int c,int x)
{ //异号的情况下内存容易溢出
System.out.println("a="+a+" "+"b="+b);
a=a-b;
b=a+b;
a=a-b;
System.out.println("a="+a+" "+"b="+b);
return true;
}
public boolean Fun(int a,int b,char c)
{//Java中修复了两个变量值相同的漏洞,在C++ 中两个值相同的话交换的结果是第一个值重置为0
System.out.println("a="+a+" "+"b="+b);
a=a^b;
b=b^a;
a=a^b;
System.out.println("a="+a+" "+"b="+b);
return true;
}
public boolean Fun(int a,int b,boolean c)
{
System.out.println("a="+a+" "+"b="+b);
a=b+(b=a)*0;
System.out.println("a="+a+" "+"b="+b);
return true;
}
public boolean Fun(int a,int b,double x)
{//这种方法中b不可以为0,但是a可以为0
System.out.println("a="+a+" "+"b="+b);
a=a*b;
b=a/b;
a=a/b;
System.out.println("a="+a+" "+"b="+b);
return true;
}
}
关于以上算法在时间效率和空间效率上孰优孰劣,还有待考究!