原文鏈接:
http://blog.sina.com.cn/s/blog_a53544e0010146nv.html
異或運算^。是個很重要的位運算。
簡單的說:
0^0=0
1^0=1
1^1=0
並且有A^0=A A^A=0
並且B^A^A=B 因為B^A^A=B^(A^A)=B^0=B
然后可以利用他來交換AB的值 只要這樣
A^=B
B^=A
A^=B
運用距離:
1-1000放在含有1001個元素的數組中,只有唯一的一個元素值重復,其它均只出現
一次。每個數組元素只能訪問一次,設計一個算法,將它找出來;不用輔助存儲空
間,能否設計一個算法實現?
這個算法已經足夠完美了,相信出題者的標准答案也就是這個算法,唯一的問題是,如果數列過大,則可能會導致溢出。
解法二、異或就沒有這個問題,並且性能更好。
將所有的數全部異或,得到的結果與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的結果也是有規律的,算法比高斯定律還該簡單的多。