关于异或(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
- 关于异或(XOR)的有趣应用
- XOR 异或的性质及应用
- 异或的一些有趣的应用
- 有趣的异或
- 关于宏的有趣应用
- 异或运算符(xor) 的妙用
- 有趣算法--“异或” 原理及应用
- 加密101-异或(xor)
- XOR (异或)加密简单实现
- 神经网络实现异或(XOR)
- BZOJ2115: [Wc2011] Xor(异或方程组)
- xor 逻辑异或
- 口算异或xor
- XOR异或
- 异或运算xor
- NOJ——1669xor的难题(树状数组的异或求和)
- hdu3949 XOR(求所有的异或和的第k小,高斯消元求线性基)
- HDU 3949 XOR 异或
- python的Jenkins接口调用
- JQuery加载Json对象到form
- Hibernate 对象的几种状态
- 可选项
- JQuery的each方法详解
- 关于异或(XOR)的有趣应用
- tjut 1251
- if语句
- 控件内容遇到导航条出现偏移的情况
- 第3课 Go控制,循环,选择,跳转语句
- Java线程的同步与死锁
- str()和repr()(及''操作符)以及python对json的简单操作
- ios第一天学习
- Nginx+Tomcat负载均衡配置