因為博弈論里,尤其實在求sg函數時,經常會用到異或運算,所以我就把網上搜到的一些相關知識和自己的一些理解記下來。
如果出現差錯,還請指出,謝謝!
異或:可以簡稱Xor,可以用數學符號⊕表示,計算機就一般可以用^表示了。
異或運算主要指二進制中。
0⊕0=0,
0⊕1=1
1⊕0=1,1⊕1=0
可以看成是兩個值相同得0,不同得1。
另一種求值方法就是兩數相加,但是不進位,如1⊕1=0,可以看作1+1=10,但是不進位,所以1⊕1=0。
關於一些運算法則
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
我舉例說明一下法則5的運用。
例題:已知一串只含大於0的int型整數的數字,其中大部分數都出現了兩次,但只有一個數只出現了一次,求這個數的值。
如5 5 3 2 2 1 3,數字5,3,2都出現了兩次,而只有1只出現了一次,所以這串數字的答案為1。又如3,4,5,5,4,2,3 的答案為2。
對於這題,可以使用hash數組,但可能會使用過大的空間。如果用異或就簡單許多了。因為a⊕a=0; 0⊕b=b;a⊕b⊕a=b;
如5 5 3 2 2 1 3求異或 5 ⊕ 5 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 ⊕ 3 = 5 ⊕ 5 ⊕ 3 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 = 0 ⊕ 0 ⊕ 0 ⊕ 1 = 1;數列中出現兩次的數5,3,2在異或都將得出0,因此得出只出現一次的數字1。
這題只要將所有數字異或即可得只出現一次的數字。而且這方法極大的節約了空間和時間。