关于异或(XOR)的有趣应用

来源:互联网 发布:电子书阅读器 知乎 编辑:程序博客网 时间:2024/06/06 04:29

异或是个非常有意思的东西,利用异或的性质我们可以做一些有意思的事情。

异或加密解密

下面是一个非常简单的加密解密函数

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 = 200b = a - b; // a = 300, b = 100a = a - b; // a = 200, b = 100

同样的,我们也可以得到交换后的结果,不过这种方法是有局限的,如果当a + b > Integer.MAX_VALUE时,这个地方是有问题的。

好了扯了这么多,下面我们来介绍使用XOR方式来进行交换:

a ^= b;     // a = a ^ b, b = bb = a ^ b;  // a = a ^ b, b = aa = a ^ b;  // a = b, b = a
看了代码,其实这个有点类似上面我们介绍的加法交换,总结规律就是:

1. 让某个值(A)等于这两个值经过某种运算(#)后的结合值(A = A # B),此时有一个值(B)是保持不变的。

2. 让保持不变的值(B)通过结合值(A)与保持不变的值(B)经过某种运算(*)后,使B的值变成A的值。

3. 同理,由于B已经变成了A的值,那么再经过运算(*)后,便可以使得A的值变为B的值。

写这么多其实还不如看代码,慢慢理解来的直接,只不过一般文章都有个总结,那就加了个。

0 0