異或運算及其應用

2021-06-28 17:01:25 字數 1430 閱讀 2608

異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示,

其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。

它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。

交換律:a ^ b = b ^ a

結合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

d = a ^ b ^ c 可以推出 a = d ^ b ^ c

自反性:a ^ b ^ a = b

最常見的做法就是增加乙個臨時變數,**如下:

public

void switchvalue(int a, int b)

公升級版,將兩個數加減來實現,**如下:

public

void switchvalue(int a, int b)

利用異或運算,也可以將兩個數交換,例如:

public

void switchvalue(int a, int b)

①1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

解法一:將所有數加起來,減去1+2+...+1000的和。

這個演算法已經足夠完美了,相信出題者的標準答案也就是這個演算法,唯一的問題是,如果數列過大,則可能會導致溢位。

解法二:異或就沒有這個問題,並且效能更好。將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。

解法一很顯然,解法二需要證明一下:

前面提到異或具有交換律和結合律,所以1^2^...^n^...^n^...^1000,無論這兩個n出現在什麼位置,都可以轉換成為1^2^...^1000^(n^n)的形式。

其次,對於任何數x,都有x^x=0,x^0=x。

所以1^2^...^n^...^n^...^1000 = 1^2^...^1000^(n^n)= 1^2^...^1000^0 = 1^2^...^1000(即序列中除了n的所有數的異或)。

令,1^2^...^n^..^1000(序列中包含乙個n)的結果為t

則1^2^..^n^..^n^..^1000(序列中包含2個n)的結果就是t^n。

t^(t^n)=n。

所以,將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。

②乙個陣列存放若干整數,乙個數出現奇數次,其餘數均出現偶數次,找出這個出現奇數次的數?

這個其實是①的乙個變形題目,最直接的辦法還是和上面一樣,就是把所有數異或 (奇數個異或是本身,偶數個是0)

參考資料:

異或運算及其應用

異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。交換律 a b b a 結合律 a b c a b c a b c d a b c 可以推出...

異或運算及其應用

異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。交換律 a b b a 結合律 a b c a b c a b c d a b c 可以推出...

異或運算及其應用

異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。一 異或的性質 交換律 a b b a 結合律 a b c a b c a b c d a ...