異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。
簡單理解就是不進製加法,如1+1=0,,0+0=0,1+0=1。
性質
1、交換律
2、結合律
3、對於任何數x,都有x^x=0,x^0=x
4、自反性 a xor b xor b = a xor 0 = a
異或運算最常見於多項式除法,不過它最重要的性質還是自反性:a xor b xor b = a,即對給定的數a,用同樣的運算因子(b)作兩次異或運算後仍得到a本身。這是乙個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間: 設有a,b兩個變數,儲存的值分別為a,b,則以下三行表示式將互換他們的值 表示式 (值) a=a xor b (a xor b) b=b xor a (b xor a xor b = a) a=a xor b (a xor b xor a = 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^...^1000(序列中不包含n)的結果為t
則1^2^...^1000(序列中包含n)的結果就是t^n。
t^(t^n)=n。
所以,將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。
當然有人會說,1+2+...+1000的結果有高斯定律可以快速計算,但實際上1^2^...^1000的結果也是有規律的,演算法比高斯定律還該簡單的多。
關於最後乙個問題,我個人覺得應該是一位一位的解決,比如最低位,每兩個相鄰數字就出現乙個1,因此可以進行分組,每組的異或結果都是1;對於次低位,每四個相鄰數字出現乙個1,分組之後,這四個數字的異或值為1,以此類推。。。很多個1的異或是0,因此只需要考慮1000%2,1000%4,1000%8.。。。這些位置的最終異或結果即可,大大降低了演算法的複雜度。
個人看法,如果有更好的想法,也可以提出來。
異或的性質和運算
異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質1 交換律 2 結合律 3...
異或的性質和運算
異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質 1 交換律 2 結合律 ...
異或運算的性質
異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。簡單理解就是不進製加法,如1 1 0,0 0 0,1 0 1。性質 1 交換律a b a b...