^(异或)这个位操作的基本理论我就不细说了。这里主要总结一下该操作的妙用。
1数字交换
有int型整数a和b,怎样将其互换?
常见方法是借助一个空间c存储临时变量
int c; c = a; a = b; b = c;
那能不能不用c就可以实现交换呢?有
a = a + b; b = a - b; a = a - b;
这么做固然达到要求了,但是隐藏一个弊端。若a+b大于int型最大值呢?(完全有可能的啊)
怎么解决上述问题:异或运算
a = a ^ b; b = a ^ b; a = a ^ b;
这里用到了异或的一个性质:一个数异或同一个数两次还是原数。举个例子,32(00100000)与42(00101010)异或两次还是32,如下所示:
00100000 | |
^ | 00101010 |
结果1 | 00001010 |
^ | 00101010 |
结果2 |
00100000 |
2文件简单加密
我们在数字交换的例子中已经知道了异或运算的一个性质(一个数异或同一个数两次还是原数)。那么我们可以利用这个性质实现文件加密,为什么呢?因为计算机中的文件都以二进制存储。我们让一段二进制异或一个数字例如88,那么这段二进制就加密了,只有再异或一次88才能解密。
3性质总结
1、交换律(a ^ b = b ^ a)
2、结合律(即( a ^ b ) ^ c = a ^ ( b ^ c ) )
3、对于任何数x,都有x ^ x = 0,x ^ 0 = x
4、自反性 a ^ b ^ b = a ^ 0 = a
结合这几个性质可以用有趣的方法解决上述类似问题。