因為博弈論裡,尤其實在求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。
這題只要將所有數字異或即可得只出現一次的數字。而且這方法極大的節約了空間和時間。
關於new的一點筆記
必須delete用new建立物件的那個位址。而樓主pa getpointa 這樣其實已經改變了原來的那個new出來的位址,這時候delete就可能有問題了 如果getpointa返回的也是同一種型別的指標,且該指標也是被new出來的話,那麼delete pa這句話本身也不會出錯。否則,就錯了 另外,...
關於Binder的一點筆記
這個方法是用來將服務端的binder物件轉換成客戶端所需的aidl介面型別物件,這種轉換時區分程序的,那麼如何區分呢?咱們先做乙個實驗,建立乙個service,在乙個activity中繫結它,然後再將service設定為與activity同一程序和不再同一程序兩種情況,並列印出serviceconn...
關於git的一點筆記
很早的時候註冊了github,然後搞了一些自己寫的 上去,逐漸學會了使用git,但是目前也僅僅是乙個很淺的初級,覺得有必要記錄一下呵呵。1 在github上面建立乙個倉庫 2 git clone dddddd dir 轉殖到本地 3 git add 新增檔案到working memory 4 git...