一个关于数据交换的算法,不理解,高手解释一下!public class Chen { public void huan1(int a,int b){
a = a - b;
b = a + b;
a = b - a;

System.out.println("a: "+a);
System.out.println("b: "+b);
}

public void huan2(int a,int b){
a = a ^ b;
b = a ^ b;
a = a ^ b;

System.out.println("a: "+a);
System.out.println("b: "+b);
}

public static void main(String[] args) {
Chen chen = new Chen();
chen.huan1(10, 5);
chen.huan2(6,4);
}
}运行结果:
a: 5
b: 10
a: 4
b: 6

解决方案 »

  1.   

    一般做法是定义一个临时变量:
    c=a;
    a=b;
    b=c;
    很明显一个的特点就是在操作中C变量是不变的。上面的算法无非就是找出了不变的量来替换C的价值。上面的算法中的两个变量 可以想象成两个的集合 那么就很容易理解了,画个图更容易理解:
    a   |(a-b||a^b)
    --- ------
    b   |
    ---
    括号中的变量是不变的,取代临时变量的作用。 就这么简单。
      

  2.   

    a=a-b
    b=b+a   相当于b=b+(a-b)则b=a
    a=b-a   相当于a=a-(a-b)=b
      

  3.   

       00000000
      异或
      00000000 
      =
      00000000
      ============我是分界线============
      11111111
      异或
      00000000
      =
      11111111
      =============我还是分界线=============
      00000000
      异或
      11111111
      =
      11111111
      ===========又是我================
      11111111
      异或
      11111111
      =
      00000000
      =============分界线=====================
      00001111
      异或
      11111111
      =
      11110000
      ========================================
      所以 
      异或可以用来交换两个整形变量的值,而不需要第三个量的传递.
      例如:
      a=9;
      b=10;
      a=a^b;
      b=b^a;
      a=a^b;
      结果是a为10,b为9.
      

  4.   

    public void huan1(int a,int b){ 
    a = a - b; //a的值改变为a-b
    b = a + b; //b的值改变为a+b
    a = b - a; //a的值改变为b-aSystem.out.println("a: "+a); 
    System.out.println("b: "+b); 

    ^,异或,也就是模二加,运算:0^0=0,0^1=1,1^0=1,1^1=0
    public void huan2(int a,int b){ 
    a = a ^ b; //a的值变为a异或b。6异或4即:00000100异或00000110结果是:00000010,a变为2
    b = a ^ b; //b的值变为a异或b。2异或4即:00000010异或00000100结果是:00000110,b变为6
    a = a ^ b; //a的值变为a异或b。2异或6即:00000010异或00000110结果是:00000100,a变为4System.out.println("a: "+a); 
    System.out.println("b: "+b);