異或運算及其應用 查詢奇數個數的數字

2021-06-21 10:57:41 字數 817 閱讀 7256

異或運算功能很強大。用的得當可以提高演算法效率。

先說一下異或運算的運算法則:

1.  a ^ b = b ^ a

2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c

4. a ^ b ^ a = b

對於性質1,不多說,顯而易見的。

對於性質2和4,這裡最近我發現了乙個重要的應用,就是可以查詢出一組數列中具有奇數個數的數。比如:

題目:有2n+1個數,其中有n個數出現過兩次,只有乙個數字出現過一次。要求是找出這個數字。

為了說明性質2和4如何使用,先舉個例子:數列 中8有三個,而其他數字都是2個或者2的倍數(即偶數個),那麼根據性質3,我們可以得出這樣的結論:

(a^a)^(b^b)^(c^c)^(c^c)^(d^d)^(e^e)^

(f^f)^x =0^0^0^0^0^0^0^x = x;

因為a^a = 0,含有偶數個的數字異或運算的值為0, 0^x = x 最後剩下奇數個的數字x。

這樣僅僅用了一次遍歷即可找出。演算法效率明顯提高。

附c++**:

#include using namespace std;

void main()

; for(int i = 0;i<17;i++)

; for( i = 0;i<17;i++)

cout<<"結果是:"<

異或運算蠻有趣的吧!

good luck!                                  ------yaung

奇數個的那個數(異或問題)

給定些數字,這些數中只有乙個數出現了奇數次,找出這個數。每組資料第一行n表示數字個數,1 n 2 18 且 n 2 1。接下來n行每行乙個32位有符號整數。出現奇數次那個數,每組資料對應一行。511 2237 1212 2333 2 include include int main printf d...

異或運算及其應用

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

異或運算及其應用

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