不使用中间变量交换两变量(异或运算)
一、异或XOR
异或运算符(^)是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0 (任何数与0异或等于其自身)
例如:(1011)2 ^ (1001)2 = (0010)2
异或运算也是一种简单的加密算法。
例如:
原文:100101
密钥:101110
对原文加密即用 原文与密钥异或运算可得到密文
原文^密钥=密文:001011
对密文解密即用 密文与密钥异或运算可得到原文
密文^密钥=原文:100101
代码演示:
//原文
int text = 37;//二进制为100101
String str_text = Integer.toBinaryString(text);
//密钥
int key = 46;//二进制为101110
String str_key = Integer.toBinaryString(key);
//密文
int ciphertext;
ciphertext = text ^ key;
String str_cip = Integer.toBinaryString(ciphertext);
System.out.println("2进制输出各数:");
System.out.println("原文:"+str_text);
System.out.println("密钥:"+str_key);
System.out.println("密文:"+"00"+str_cip);
//用密文异或密钥得原文
ciphertext = ciphertext ^ key;
str_cip = Integer.toBinaryString(ciphertext);
System.out.println("还原:"+str_cip);
执行效果:
2进制输出各数:
原文:100101
密钥:101110
密文:001011
还原:100101
二、使用异或运算(^)交换变量
如果给定整数a和b,用以下三行代码即可交换a和b的值。
a = a ^ b;
b = a ^ b;
a = a ^ b;
对于三行代码的理解:
- 假设a异或b的结果记为c,c就是a整数位信息和b整数位信息的所有不同信息。
比如,a=4=100,b=3=011,a^b=c=111。 - a异或c的结果就是b。比如a=4=100,c=111,a^c=011=3=b。
- b异或c的结果就是a。比如b=3=011,c=111,b^c=100=4=a。
所以,在执行完上面三行代码之前,假设有a信息和b信息。执行完第一行代码之后,a变成了c,b还是b;执行完第二行后,a仍然是c,b变成了a;执行完第三行代码之后,a变成了b,b仍然是a。过程结束。