異或運算子

2021-08-14 23:39:18 字數 1512 閱讀 1048

表示當兩個數的二進位制表示,進行異或運算時,當前位的二進位制相同為0,不同為1.
表示為:

特點

0異或任何數,是任何數;

1異或任何數,任何數取反;

任何乙個數字異或自己都等於0

面試題:乙個整型陣列中除了兩個數字之外,其他的數字都出現了兩次。試找出這兩個只出現一次的數字。《劍指offer》

例如,陣列 中,5和6只出現了一次,其他都出現了兩次。

這個問題想了很長時間,一直無解。

題中提到有兩個出現一次的數字,先嘗試解決陣列中只有有乙個出現一次的數字的。

比如,

1 ^ 2 = 3

1 ^ 3 = 2

2 ^ 3 = 1

1 ^ 1 = 0

2 ^ 2 = 0

3 ^ 3 = 0

這裡利用異或的第三個特點,任何乙個數字異或自己都等於0.我們從頭到尾依此異或陣列中的每乙個數字,那麼最終的結果剛好是那個只出現一次的數字,因為那些成對出現的數字全部都在異或中抵消了。

如,,1 ^ 2 ^ 3 ^ 1 ^ 2 = 3.

現在找只出現一次的兩個數字,如,

1 ^ 2 ^ 3 ^ 4 ^ 3 ^1 ^ 6 ^ 2 ^ 5 = 5 ^ 6.

從頭到尾依次異或陣列中的每乙個數字,那麼最終得到的結果就是兩個只出現一次的數字的疑惑結果。因為其他數字都出現了兩次,在異或中全部抵消了。

由於兩個數字不一樣,異或結果不為0,也就是說在這個結果數字的二進位制中至少有一位為1.

如上圖,以第二位1為標準(第一位1也滿足),把原陣列中的數字分為兩個子陣列,第乙個子陣列中每個數字的第二位都是1,而第二個子陣列中每個數字的第二位都是0.

由於我們分組的標準是數字中的某一位是1還是0,那麼出現了兩次的數字一定會被分配到同乙個子陣列。這樣每個子陣列都包含乙個只出現一次的數字,而其他數字都出現了兩次。

//**實現

unsigned int find_first_bitis_1(int num)

return

index;

}bool isbit_1(int num, unsigned int

index)

void findnum_once(int array, int

length, int* num1, int* num2)

else}}

void swap(int* a, int* b)

int main()

例如,有01011011,想要高四位取反,可以將它和11110000進行 ^ 運算,

01011011 ^ 11110000 = 10101011

與0相^保留原值。

異或運算 運算子 對異或運算子的認識以及初次運用

1 0 1 相同的二進位制位相異或結果不變.int x 3 int y 4 x x y x 3 4 y x y y 3 4 4 3 x x y x 3 4 3 4 上述運算的結果是 x和y的值互換.而過程中並沒有使用別的運算子.即所說的沒有借助其它變數就實現了兩個變數的交換.異或運算是與 並列的位運...

異或運算子和位運算子詳解

一.異或運算子 1.異或運算子是用符號 表示的,其運算規律是 轉換成二進位制的形式來對比每一位數,相同則結果為0,不同則結果為1。分析 a 的值是15,轉換成二進位制為 1111,而b 的值是2,轉換成二進位制為 0010,根據異或的運算規律,可以得出其結果為 1101 即最終 a b的值為13 二...

C的 異或 !運算子

1 按位與運算子 按位與運算將兩個運算分量的對應位按位遵照以下規則進行計算 0 0 0,0 1 0,1 0 0,1 1 1。即同為 1 的位,結果為 1,否則結果為 0。例如,設3的內部表示為 00000011 5的內部表示為 00000101 則3 5的結果為 00000001 2 按位或運算子 ...