jianchen 发表于 2013-2-5 02:15:51

java基础复习(7)--值传递和交换变量值(异或)

对于java中的方法参数传递是传值方式,最典型的是,java中无法实现交换两个数值的方法,但C#和C++可以。C++总所周知是通过指针可以直接访问实参。而C#使用ByRef声明就可以实现。

不利用自己提供的临时变量,两个数交换:
方法一:
a = a+b;
b = a-b;
a = a-b;
但是这样需要考虑到a+b溢出的问题。
还有可以利用异或运算实现。

方法二:
void swap(int &a,int &b)
{
     a^=b;
    b^=a;
    a^=b;
}

原理理解如下:

               a-------------------------b
a^=b    a^b-----------------------b
b^=a    a^b-------b^(a^b) => a
a^=b    a^b^(a) => b-----------a

OK           b-------------------------a


要知道,a^b=c  =>  a^c=b;a^c=b;

即只要直到a,b,c中的任意两个,即可利用异或运算退出另外一个数。
<div class="t_msgfont">RAID里面就用到了这技术。三个里面知道任意两个就可以恢复第三个,磁盘位的恢复的一种手段。
页: [1]
查看完整版本: java基础复习(7)--值传递和交换变量值(异或)