异或运算
异或运算可以看做是没有进位的加法,按位异或运算,相同为0,不同为1。
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
观察运算结果我们发现,当与0做异或运算时,另一元值不变;而与1做异或运算时,另一元值值取反。
用途
根据以上异或运算的特征,可以有以下用途,除方便直观外,运算性能也更加优异。
1)变量重置0
假设有一个变量15,二进制表示为0000 1111
0000 1111 ^ 0000 1111 = 0000 0000
a = 0000 1111
a = a ^ a
结论:同变量本身异或运算,可以将变量重置0。
2)指定位置取反
假设有一个变量15,二进制表示为0000 1111,将第3,4,8位取反。
0000 1111 ^ 1000 1100 = 1000 0011
结论:同指定取反位为1,其他位为0的变量进行异或运算,可以将指定位置取反。
取反后的结果,同原指定取反变量异或,可以还原变量:
1000 0011 ^ 1000 1100 = 0000 1111(15)
3)加密解密
假设有一个变量15,二进制表示为0000 1111,密码子为0101 0101。
加密:0000 1111 ^ 0101 0101 = 0101 1010
加密后结果是90。
将加密后结果同密码子异或,可以进行解密
0101 1010 ^ 0101 0101 = 0000 1111
解密后结果是15。
4)二值交换
假设两个变量:a = 15(0000 1111), b= 23(0001 0111),将两个变量交换。
1、a = a ^ b = 0000 1111 ^ 0001 0111 = 0001 1000
2、b = b ^ a = 0001 0111 ^ 0001 1000 = 0000 1111(15)
3、a = a ^ b = 0001 1000 ^ 0000 1111 = 0001 0111(23)
结论:二值交换实际上是利用了加密解密的特性。
1、a和b异或,可以把结果x看作是a、b互为密码子进行加密。
2、将x,同b(原值)异或,也就是把b作为密码子,因此可以还原a,赋值给b。
3、将x,同b(此时为a)异或,也就是把b(此时为a)作为密码子,因此还原出的值为原b,赋值给a。交换结束。
5)判断两值是否相等
利用同变量本身异或运算,可以将变量重置0的特性。
假设:a = 0000 1111,b = 0000 1111,则 a ^ b == 0
假设:a = 0000 1111,b = 0000 0001,则 a ^ b != 0
结论:当两个变量相等时,异或结果为0。
閱讀更多 有趣的代碼 的文章