異或操作的應用

2021-06-07 05:12:21 字數 2078 閱讀 3642

1,異或運算的規則:

a) 0 xor 0 = 0

b) 0 xor 1 = 1

c) 1 xor 0 = 1

d) 1 xor 1 = 0

2, 異或運算的性質:

a)  a xor a = 0

b) (a xor b) xor c = a xor (b xor c)

c)  if a xor b = c then a xor c = a xor (a xor b) = (a xor a) xor b = b

3, 異或的應用

q1: 乙個陣列,除其中乙個元素(如下面的99),其它的都是成對出現的,如何能快速找出那99的位置

……102,102,2,2,44,44,99,23,23,11,11 ……

請參考: 參考貼子

answer 1:

把所有陣列元素全部異或一下則得到非成對出現的元素99,然後順序查詢99的位置。時間複雜度為o(n)。

此解法較通用,適合如下兩種特殊情況:

a),如……102,102,2,2,2, 2,44,44,99,23,23,11,11 ……(連續但存在相同元素)

b),如...... 102,2,44,23,11,99,11,23,44,2,102......(配對但不連續)

若資料無素不會出現3(a)和(b)中情況,那麼可以採用一種更高效的演算法:

answer 2:

折半查詢。

若陣列a的元素個數為(n+1),則n+1必為奇數。陣列a的序號為0到n。

left = 0; right = n; m = (left+right)/2;

int find99(left,right);

m = (n+0)/2,

if: m為偶數,也即m兩邊的數量都為偶數,分別判斷a[m]與a[m-1]、a[m+1]的值,若與a[m-1]相等,則99必在左側,那麼接下來就find99(left,m-1)。若與a[m+1]相等,則99必在右側,那麼find99(m+1,right)。若都不相等,則a[m] == 99,return m。

else: 若m為奇數,也即m兩邊的數量都為奇數,分別判斷a[m]與a[m-1]、a[m+1]的值,若與a[m-1]相等,則99必在右側,find99(m+1,right)。若與a[m+1]相等,則99必在左側,find99(left,m-1)。若都不相等,則a[m] == 99,return m。

q2:乙個很大的陣列,裡面有兩個數隻出現過一次,其他數都出現過兩次,把這兩個數找出來

ref :參考貼子

answer 1:

在題目給出的很大的陣列中,除要找的兩個不同的數字外,其它的數字都是成對出現的,根據上面說到的兩個相同的數字的異或其結果為0。因此,如果將整個陣列中的元素進行異或,所得到的結果應該是所求的那兩個不成對的數字的異或結果。

假定陣列中兩個不同的數字是95 ^ 99,則其異或的結果是0111100b,其中有4位是1,這表明這兩個數字的二進位制表示中有4位是不同的。(從右往左數) 它們分別是第3、4、5、6這4位,於是我們只需要

將陣列中所有元素中第6位為1的元素和0111100b異或,

or,將陣列中所有元素中第5位為1的元素和0111100b異或,

or,將陣列中所有元素中第4位為1的元素和0111100b異或,

or,將陣列中所有元素中第3位為1的元素和0111100b異或。

就可以得到所求之兩個數字中的乙個數字。

不妨以上面最後一條規則為例來進行說明:陣列元素中第3位為1的數字,除所求的兩個數字之外,都是成對出現的,它們所產生異或的結果肯定是0。而所求的那兩個數字當中只有乙個數字的第3位1。不妨假定這個數字是a(此時未知),另外乙個要求的數字是b(此時未知)。很明顯,將a (此時未知)和0111100b異或就可以得到b (此時已知),再用0111100b和已經求出來的b (此時已知) 進行異或就可以得到a (此時已知)。比如上面的95的第3位為1,所以用95 ^ 0111100b = 1011111b ^  0111100b = 1100011b = 99,再用99 ^ 0111100b = 1100011b ^ 0111100b = 1011111b = 95。

位操作應用 異或

0abcdef題意 購買了n對襪子,每對襪子都有自己的名字 即7個字元 丟失了乙隻,找出丟失的襪子的名字。首先想到的是對二維字元陣列排序,這樣很費空間。還有一種做法就是用異或操作。用兩個字串a和b分別記錄前一次的結果和新輸入的字串,對同下標的字元進行異或操作,最後結果就是a。異或運算滿足交換律 b ...

異或 運算的應用

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 可以推出...