異或運算
異或運算可以看做是沒有進位的加法,按位異或運算,相同為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。
閱讀更多 有趣的代碼 的文章