異或運算的應用與nimm博弈

2021-07-31 07:45:40 字數 2055 閱讀 1252

異或運算的性質

1、交換律

2、結合律(即(a^b)^c == a^(b^c))

3、對於任何數x,都有x^x=0,x^0=x

4、自反性 a xor b xor b = a xor 0 = a

5、消去率a^b=c^b;則一定有a=c,這一條是and or都不能滿足的,只有+ -才會有的

應用1:所有的程式教科書都會向初學者指出,要交換兩個變數的值,必須要引入乙個中間變數。但如果使用異或,就可以節約乙個變數的儲存空間: 設有a,b兩個變數,儲存的值分別為a,b,則以下三行表示式將互換他們的值 表示式 (值) :

a=a^b

b=b^a

a=a^b

類似地,該運算還可以應用在加密,資料傳輸,校驗等等許多領域。

應用2:

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的結果也是有規律的,演算法比高斯定律還該簡單的多。

應用3:

google面試題的變形:乙個陣列存放若干整數,乙個數出現奇數次,其餘數均出現偶數次,找出這個出現奇數次的數?

解法有很多,但是最好的和上面一樣,就是把所有數異或,最後結構就是要找的,原理同上!

尼姆博弈(nimm』s game):

有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。

求必勝策略。

結論:為了方便討論,我們假設有3堆石子(a,b,c),定義a^b^c=0的情況為奇異狀態,無論誰開始移動的時候面對的是奇異狀態,都是必輸。

方法:當我們面對非奇異狀態的時候,移動x個石子,使下個人移動的時候變為奇異狀態

非奇異局勢(a,b,c),d=(a(^)b(^)c),a,b,c中存在乙個數,^d小於自身,假設這個數是c。要如何變為奇異局勢呢?我們只要將 c 變為 a^b,即可,因為有如下的運算結果:

a^b^(a^b)=0;

而要將c 變為a^b,只要從 c中減去 c-a^b即可(c一定大於a^b),所以我們在面對非奇異狀態的時候只需從最多的那一堆c中移動x=(c-a^b)個石子,使c變成a^b即可把狀態變為奇異狀態,保證必勝!

推廣到i個的情況,也就是存在乙個ai,讓ai變為ai』即可把非奇異狀態變為奇異狀態。其中ai』為除去ai外所有石子數的異或:(a1^a2^a3…^an)

異或 運算的應用

1.異或運算 關於異或,有兩種計算。一是邏輯異或,一是按位異或。所謂邏輯異或就是運算數是true或者false。比如p1 true,p2 true,p1 p2。按位異或則是將變數轉化為二進位制,每一位分別異或。相同為0,不同為1。按位運算如 優先順序位於關係運算子之後,邏輯運算子之前。好像不經常強調...

異或運算的應用

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

異或運算的應用

異或的運用 unique you 2018 03 22 13 31 36 1654 收藏 16 展開異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結...