当前位置: 代码迷 >> Java相关 >> [讨论]交换程序的一点想法。。
  详细解决方案

[讨论]交换程序的一点想法。。

热度:181   发布时间:2007-06-24 20:06:52.0
[讨论]交换程序的一点想法。。

在以前的写C的时候经常用到三种交换算法:
第一种:(也是最基本的一种,就是临时变量法)
第二种: x=x+y;
y=x-y;
x=x-y;
第三种:这种只能在C或者C++种行,JAVA中行不通。就是通过异或操作符号,并且这种交换算法速度最快。

异或操作符:^ 有一条性质:x^y^x=y;根据这条性质,我们可以改变交换一下两个数的值。

x=x^y;

y=y^x;

x=y^x;

这样x,y其不是交换了哈哈。下面的小程序演示了一下这个交换问题哈哈。

public class CleverSwap{

public static void main(String[ ] args){

int x = 10;

int y= 15;

x ^ = y ^ = x ^ = y // (1)

System.out.println("x"+"="+x+"y"+"="+y);

}

}

上面的小程序的结果是x=0,y=10;结果不是预期的,哎。我郁闷。。。。这说明在JAVA中这种方法不行。。因为JAVA中在计算x^=y时,是先提取出了x的值。

JAVA中为了实现上面的表达式(1),是这样实现的:

int temp1 = x;

int temp2=y;

int temp3=x^y

int x=temp3;

int y=temp2*temp3;

int x=temp1^y;

呵呵,现在终于知道结果为什么是这样了哈哈。如果JAVA中不规定表达式的计算顺序的话,此方法也可以在JAVA中用了哈哈。


----------------解决方案--------------------------------------------------------
如果JAVA中也是在计算后才提取变量的值就可以用速度快的交换算法了,直接在寄存器里就完成运算了呵呵。。
----------------解决方案--------------------------------------------------------
呵呵,有道理~没注意在C中习以为常的东西在Java中会有差别~
----------------解决方案--------------------------------------------------------
哈哈,我也是那天写汇编程序的时候,当写一个异或表达式时,突然有的想法,然后总结了一下。。今天和各位大哥大姐分享讨论下哈哈
----------------解决方案--------------------------------------------------------
  相关解决方案