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

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

异或加密解密

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

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的值。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值