在不使用新变量的前提下,交换变量a和变量b的值
public class Swap {
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println("a="+a);
System.out.println("b="+b);
}
}
通常我们在交换变量的值都会通过创建临时变量来交换两个变量的值,如下图所示
public class Swap {
public static void main(String[] args){
int a = 10;
int b = 20;
int temp; //临时变量
temp = a; //将a赋值给temp
a = b; //将b赋值给a
b = temp; //将temp赋值给b
System.out.println("a="+a); //输出结果 a=20
System.out.println("b="+b); //输出结果 b=10
}
}
疑问:当限制无法采用新的变量进行传值之后,我们该如何对a和b进行值交换的操作呢?
这里需要了解一下异或的概念:
异或是一个数字运算符,英文名为exclusive OR,缩写为xor,应用于逻辑运算,异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为: a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b的值不相同,则异或结果为1;
如果a、b的值相同,则异或结果为0;
例: 当a的二进制为:1010,b的二进制位1101时
a: 1010
b: 1101
——————
结果:0111
思路:我们可以称a的原码为原文,与其进行异或操作的另一个值的原码称为密钥,将其异或后的值称为密文,当a与b异或后的密文再与a或者b的原文进行异或操作,是否就可得到另一个值的原文,并对其进行赋值操作?
解决:当a = 10时,其二进制为01010,当b = 20时,其二进制为10100,异或操作后所得到的密文则为11110。
public class Swap {
public static void main(String[] args){
int a = 10; //二进制为:01010
int b = 20; //二进制为:10100
a = a^b; //异或结果为11110,当前a表示原文,b表示密钥,结果表示密文
b = a^b; //当前a为密文值11110,b表示原文10100,其异或结果为01010
a = a^b; //当前b为01010,a为密文值11110,其异或结果为10100
//结果输出为十进制值
System.out.println("a="+a); //输出结果 a=20
System.out.println("b="+b); //输出结果 b=10
}
}