异或运算_专题 | 异或运算的一些应用
點擊上方藍字設為星標
每周一、三、五上午 8:30 準時推送
下面開始今天的學習~
定義
異或是一個數學運算,用于邏輯運算。如果 a、b 兩個值不同,則異或結果為 1 ,否則結果為 0 。真值表如下:
a
運算符
b
結果
0 | ⊕ | 0 | 0 |
1 | ⊕ | 0 | 1 |
0 | ⊕ | 1 | 1 |
1 | ⊕ | 1 | 0 |
記真值表的時候有的同學可能覺得很容易記錯,也有同學喜歡記異或運算的公式,比如:P = AB' ⊕ A'B(“ ' ”表示非)。其實這兩種方法都可以,還有一種方式我個人覺得記憶起來更容易一些,即?異或運算是半加運算。什么意思,半加?即不帶進位的加法運算。再來看一下上面的真值表:
a
運算符
b
結果
0 | + | 0 | 0 |
1 | + | 0 | 1 |
0 | + | 1 | 1 |
1 | + | 1 | (1)0 |
括號里的 1 是進位,不考慮進位,即?半加?運算,這樣記起來是不是更容易些呢?
在計算機中的應用
很常見的一個應用就是交換兩個數的值。例如:
這樣寫法的好處就是少了一個臨時變量,執行效率也比較高。
我們再來看一下 LeetCode 上的一些題目,可以用異或運算巧妙的解決。
136. 只出現一次的數字
給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
這個題首先想到的就是異或的特性。相同的數字異或的結果為 0,那么出現奇數次的一定就是最后我們想要的結果。
287. 尋找重復數
給定一個包含 n + 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重復的整數。假設只有一個重復的整數,找出這個重復的數。
示例 1:
輸入: [1,3,4,2,2]
輸出: 2
示例 2:
輸入: [3,1,3,4,2]
輸出: 3
說明:
不能更改原數組(假設數組是只讀的)。
只能使用額外的 O(1) 的空間。
時間復雜度小于 O(n2) 。
數組中只有一個重復的數字,但它可能不止重復出現一次。
我們注意看下題目,題目明確說明了數組?nums?包含 1 和 n ,并且只有一個重復的整數,如果不考慮說明中的第四點的話這段代碼是正確的。解釋一下原理。a 從 1 一直異或到 n,其中有一個重復的數字 x ,那么就是?1 ^ 2 ^ 3 ··· ^ x ^ x ^ ··· ^ n。異或操作因為是半加運算,因此是滿足交換律的,我們把 x 拿到最后面, 即?1 ^ 2 ^ 3 ··· ^ n ^ x ^ x,而?x ^ x?一定是?0?,因此 1 ~ n 每個數異或了 2 次,而 x 異或了 3 次,所以最后 res 的值就是我們要找的 x 的值。
但是有了第四點,這個方法就不太好用了,下面是一個正確的解法,由于跟異或沒有太多的關系,因此就不過多解釋。
389. 找不同
給定兩個字符串 s 和 t,它們只包含小寫字母。
字符串 t 由字符串 s 隨機重排,然后在隨機位置添加一個字母。
請找出在 t 中被添加的字母。
示例:
輸入:
s = "abcd"
t = "abcde"
輸出:
e
解釋:
'e' 是那個被添加的字母。
這個題目如果想不到用異或運算的話,寫起來可能真的會有點麻煩。我們想到異或運算的特點,a ^ a = 0,如果插入了一個字母的話,那么這個兩個字符串中,出現的次數肯定是奇數次,而其他的都是偶數次,所以直接把所有的字符都異或一遍,答案自然就出來了!
之前還有一個面試題目,就是有 N + 1 塊相同容量的硬盤,其中 N 塊用來存儲數據,如果利用多余的 1 塊硬盤來存儲 N 塊硬盤的數據備份,假設硬盤最多同時只會損壞 1 塊。我想通過上面幾個題,大家應該很快想到存儲辦法了吧,答案就是多余的 1 塊硬盤存儲 N 塊硬盤異或的結果,那么當其中 1 塊硬盤損壞的時候,只需要把其他好的硬盤數據再異或一遍,即可得到損壞的硬盤的數據了。
通過上面的例子,我們發現在查找“奇數個”的數據的時候,異或運算用起來還是非常方便的。異或運算還有很多其他的應用,比如簡單的加密數據,加密:result = a ^ password,解密:a = result ^ password。
異或運算很簡單,難點在于遇到問題能不能想到利用異或運算來解決問題,這就需要我們在編程過程中一點點積累經驗,祝大家學習順利!
本文作者:么一林
編輯&版式:霍霍
聲明:本文歸 “力扣” 版權所有,如需轉載請聯系。
總結
以上是生活随笔為你收集整理的异或运算_专题 | 异或运算的一些应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器人布里茨说什么_LOL蒸汽机器人布里
- 下一篇: 日志级别_Feign:请求压缩amp;日