c++的異或操作“^”的一點理解


  昨天在leetcode上寫到一道題,給出一個整形數組,這個數組當中有很多不同的整數,這些整數當中只有一個數字只出現一次,其他的整數都出現兩次。題目的要求:找出數組中只出現一次的數字,不開辟另外的數組空間實現。看到題目之后,我根本就想不到不開辟數組空間的方法實現,果斷看評論,然后知道了c++里面的異或操作,這題可以根據異或操作(^)來實現。以下我給出自己證明證明為什么這道題可以用異或來實現。

規定

  ”異或“用”^來表示,“與”用”·“來表示,“或”用“+”來表示。

(A^B)^B=A證明

  根據數字電路的知識,給出以下證明:

 

 

 

 

(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個或異門,最終的結果與接入的前后順序無關。

結論

  根據上面兩個式子可以得出下面這個結論,依次對數組中的整數做異或操作,((A^B)^C)^A=B^C,我們可以把A看成是數組中出現了兩次的數字,B和C兩次A出現時中間出現過的數字,驚奇地發現,A進行了兩次異或之后A就跟沒有進行過異或一樣,無論A出現的位置先后。

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

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


上天保佑,希望我期末考試別掛科。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM