異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。
異或的性質:
1、交換律:a^b = b^a;
2、結合律:(a^b)^c = a^(b^c);
3、對於任意的a:a^a=0,a^0=a,a^(-1)=~a。
了解了上面這些,來看看這個,很重要,後面的程式都要用到這個結論:
對於任意的a,有a^b^c^d^a^k = b^c^d^k^(a^a) = b^c^d^k^0 = b^c^d^k,也就是說,如果有多個數異或,其中有重複的數,則無論這些重複的數是否相鄰,都可以根據異或的性質將其這些重複的數消去,具體來說,如果重複出現了偶數次,則異或後會全部消去,如果重複出現了奇數次,則異或後會保留乙個。
異或的運用
下面來看三道題目:
1、1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?
2、乙個陣列中只有乙個數字出現了一次,其他的全部出現了兩次,求出這個數字。
3、問題:乙個1~n的自然數的亂序陣列,其中缺失了1到n之間的某個數,如何快速找出這個數?
原文:異或的性質
連連看time limit: 2500 msmemory limit: 65536 kib
submitstatistic
problem description
小志最近喜歡連連看這個遊戲,但是連連看太難了,所以他發明了一種簡易的連連看,為了簡化問題,現在我們有n對整數,每對數字都是相同的,但是為了表明這個連連看是不同的,小志另外多加了乙個整數,所以我們現在就有2*n+1個整數,現在小志想知道那個單獨的整數,你能幫助他尋找到這個整數嗎?
input
第一行輸入乙個整數n(1<=n<=10000007)
第二行有2*n+1個整數,每個整數ai的範圍為(1<=ai<=1e9);
output
輸出乙個整數為那個單獨的整數。
sample input
41 3 2 1 3 1 2 1 1
sample output
1hint
根據樣例:整數1有5個為奇數個,其他的整數的個數都為偶數個,所以答案為1。
因為資料較大,請使用快速的讀入方法,例如scanf輸入和printf輸出。
source
river
#include int main()
printf("%d\n",x);
return 0;
}
另一篇關於異或用途的部落格
原文:
異或性質運用
異或 的乙個很重要的性質是 a a 0 a 0 a 下面總結幾道運用到其性質的題目。例1 有兩個整型亂序陣列,其中乙個陣列比另外乙個多乙個數字,其他數字都一樣,讓你求出這兩個陣列相差的那個數字。要求時間複雜度為o n 思路 先分別求兩個陣列的異或,然後再將兩個陣列的異或結果再進行異或,最終結果就是答...
異或運算的運用
背景1 最多有1e6 1個數,其中只有乙個數出現了奇數次,請找出這個數 資料大小為 int 範圍 利用原理 兩個相同的數異或值為0 解決方案 將所有數異或一次,最後得到的值就是出現奇數次的那個數 複雜度o n 背景2 最多有1e6個數,其中有兩個數出現了奇數次,請找出這兩個數 資料大小為 int 範...
異或的性質及運用
文章 異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質1 交換律 2 結合...