异或是个非常有意思的东西,利用异或的性质我们可以做一些有意思的事情。
异或加密解密
下面是一个非常简单的加密解密函数
public static String encryption(String srcString, char key) {
char[] srcChars = srcString.toCharArray();
for (int i = 0; i < srcChars.length; i++) {
srcChars[i] ^= key;
}
return new String(srcChars);
}
给出测试代码:
String password = encryption("eascs", 't');
System.out.println("password = " + password);
String src = encryption(password, 't');
System.out.println("src = " + src);
然后打印的结果如下:
接着大家可能会发现一个问题,就是我们的password没有数据,但是我们恢复源数据却又是正确的,其实我们猜也可以猜的出来,肯定是生成了那些无法显示的字符,为了验证这个观点,我们还是进行一下调试,下面是调试的结果截图:
这里就可以很清楚的说明了。
异或交换
估计这个功能用到的应该很少吧,其实这才是今天的重点,我们知道交换的方式有很多种,其中最常见的就是:
int a = 100;
int b = 200;
int c = a;
a = b;
b = c;
print("a = " + a + ", b = " + b);
打印结果:
交换成功了,这种方式是我们最常用的。
当然对于int类型的数据交换,我们还有一中方法,这种方法不会借用额外的变量:
a = a + b; // a = 300, b = 200
b = a - b; // a = 300, b = 100
a = a - b; // a = 200, b = 100
同样的,我们也可以得到交换后的结果,不过这种方法是有局限的,如果当a + b > Integer.MAX_VALUE时,这个地方是有问题的。
好了扯了这么多,下面我们来介绍使用XOR方式来进行交换:
a ^= b; // a = a ^ b, b = b
b = a ^ b; // a = a ^ b, b = a
a = a ^ b; // a = b, b = a
看了代码,其实这个有点类似上面我们介绍的加法交换,总结规律就是:
1. 让某个值(A)等于这两个值经过某种运算(#)后的结合值(A = A # B),此时有一个值(B)是保持不变的。
2. 让保持不变的值(B)通过结合值(A)与保持不变的值(B)经过某种运算(*)后,使B的值变成A的值。
3. 同理,由于B已经变成了A的值,那么再经过运算(*)后,便可以使得A的值变为B的值。
写这么多其实还不如看代码,慢慢理解来的直接,只不过一般文章都有个总结,那就加了个。