異或運算功能很強大。用的得當可以提高演算法效率。
先說一下異或運算的運算法則:
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 可以推出...