一个关于数据交换的算法,不理解,高手解释一下!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
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
c=a;
a=b;
b=c;
很明显一个的特点就是在操作中C变量是不变的。上面的算法无非就是找出了不变的量来替换C的价值。上面的算法中的两个变量 可以想象成两个的集合 那么就很容易理解了,画个图更容易理解:
a |(a-b||a^b)
--- ------
b |
---
括号中的变量是不变的,取代临时变量的作用。 就这么简单。
b=b+a 相当于b=b+(a-b)则b=a
a=b-a 相当于a=a-(a-b)=b
异或
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.
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);
}