異或的運用

2021-09-25 08:16:55 字數 1390 閱讀 3734

異或是一種基於二進位制的位運算,用符號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 結合...