c++的異或操做「^」的一點理解

  昨天在leetcode上寫到一道題,給出一個整形數組,這個數組當中有不少不一樣的整數,這些整數當中只有一個數字只出現一次,其餘的整數都出現兩次。題目的要求:找出數組中只出現一次的數字,不開闢另外的數組空間實現。看到題目以後,我根本就想不到不開闢數組空間的方法實現,果斷看評論,而後知道了c++裏面的異或操做,這題能夠根據異或操做(^)來實現。如下我給出本身證實證實爲何這道題能夠用異或來實現。c++

規定

  」異或「用」^來表示,「與」用」·「來表示,「或」用「+」來表示。數組

(A^B)^B=A證實

  根據數字電路的知識,給出如下證實:
spa

 

 

 

 

(A^B)^C=(A^C)^B證實

 

   根據上述化簡的結果,很容易能夠發現表達式裏面的對稱性,證得(A^B)^C=(A^C)^B=(B^A)^C=(B^C)^A=(C^A)^B=(C^B)^A,也便是三個變量接2個或異門,最終的結果與接入的先後順序無關。code

結論

  根據上面兩個式子能夠得出下面這個結論,依次對數組中的整數作異或操做,((A^B)^C)^A=B^C,咱們能夠把A當作是數組中出現了兩次的數字,B和C兩次A出現時中間出現過的數字,驚奇地發現,A進行了兩次異或以後A就跟沒有進行過異或同樣,不管A出現的位置前後。blog

  因爲計算機中整型數據的本質是一堆0和1以補碼的形式存儲,有了上面的證實,「只出現一次的數字」就是對數組中元素依次異或最終獲得的數字,出現兩次的數字都是進行了兩次異或的數字,被」抵消「了。leetcode

  拓展:對整型數組中的數字依次作異或,最終的出來的數字是對整型數組中出現奇數次的數字作異或的結果,根據這個結論能夠靈活地解其餘地變式的題目。變量


上天保佑,但願我期末考試別掛科。方法

相關文章
相關標籤/搜索