1.问题
交换a,b值的(不能借助临时变量)。
2.解决方法
(1)用数学方法:
public class TestStudy {
public static void main(String[] args) {
int a=4;
int b=5;
System.out.println("a修改前的值"+a);
System.out.println("b修改前的值"+b);
a=a+b;
//a-b应该等于a,但赋值是b 即b=a
b=a-b;
//再用a=a-b 即a=b
a=a-b;
System.out.println("a修改后的值"+a);
System.out.println("b修改后的值"+b);
}
}
结果:
这种方法采用数学逻辑,考验数学功底,与编程关联不大。
(2)用编程方法:
public class TestStudy {
public static void main(String[] args) {
int a=4;
int b=5;
System.out.println("a修改前的值"+a);
System.out.println("b修改前的值"+b);
a = a^b;
b = a^b;
a = a^b;
System.out.println("a修改后的值"+a);
System.out.println("b修改后的值"+b);
}
}
结果:
3.解释原因
我们着重来讲一下第二种方法。
首先我们要知道,第二种方法采用的计算方法是一种位运算(就是直接对整数在内存中的二进制位进行操作的一种运算方式)。
而运算符(^)在编程语言中被称为按位异或(相应位上的数字不相同时取1, 相同为0。)
举个例子:
public class TestStudy {
public static void main(String[] args) {
int a=5; //a=00000000 00000000 00000000 00000101
int b=6; //b=00000000 00000000 00000000 00000110
int c=a^b; //c=00000000 00000000 00000000 00000011=3
System.out.println(c);
}
}
结果:
ok,知道了按位异或的基本原理后,我们来了解一下它具有哪些基本的运算原理,如下:
public class TestStudy {
public static void main(String[] args) {
int a=10; //a=00000000 00000000 00000000 00001010
int b=0; //b=00000000 00000000 00000000 00000000
int c=a^b; //c=00000000 00000000 00000000 00001010=10
int d=10; //d=00000000 00000000 00000000 00001010
int e=10; //e=00000000 00000000 00000000 00001010
int f=d^e; //f=00000000 00000000 00000000 00000000
System.out.println("a^0="+c);
System.out.println("a^a="+f);
}
}
结果:
ok,得到了两个基本运算。
最后我们来看看第二种方法的解释:
public class TestStudy {
public static void main(String[] args) {
int a=4;
int b=5;
System.out.println("a修改前的值"+a);
System.out.println("b修改前的值"+b);
a = a^b;
b = a^b;
a = a^b;
System.out.println("a修改后的值"+a);
System.out.println("b修改后的值"+b);
}
}
首先:
1. a=a^b;//这个把它当成条件
2. b=a^b;//把条件代入得
b=a^b^b;//b^b=0,a^0=a,所以b=a;
3. a=a^b;//把条件和上面b值代入
a=a^b^a=(a^b)^(a^b^b)//前面()为a,后面()为b
//所以a^b^a=a^a^b=0^b=b
因此a=4,与b=5的结果成功互换。