有趣的异或运算

异或运算

异或运算可以看做是没有进位的加法,按位异或运算,相同为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。

有趣的异或运算


分享到:


相關文章: