異或運算的應用

2021-09-07 23:16:09 字數 2072 閱讀 5430

異或是一種基於二進位制的位運算,用符號xor或者 ^ 表示,

其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。

它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結果為0。

交換律:a ^ b = b ^ a

結合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

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

自反性:a ^ b ^ a = b

x ^ x = 0, x ^ 0 = x

void exchange(int a, int

b)

這裡就用到了異或運算的自反性:

首先 a = a ^ b;

然後 b = a ^ b ^ b = a

然後 a = a ^ b ^ a = b

解法一:將所有數加起來,減去1+2+...+1000的和。

這個演算法已經足夠完美了,相信出題者的標準答案也就是這個演算法,唯一的問題是,如果數列過大,則可能會導致溢位。

解法二:異或就沒有這個問題,並且效能更好。將所有的數全部異或,得到的結果與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^...^n^..^1000(序列中包含乙個n)的結果為t

則1^2^..^n^..^n^..^1000(序列中包含2個n)的結果就是t^n。

t^(t^n)=n。

所以,將所有的數全部異或,得到的結果與1^2^3^...^1000的結果進行異或,得到的結果就是重複數。

這個其實是上乙個題目的乙個變形題目,最直接的辦法還是和上面一樣,就是把所有數異或 (奇數個異或是本身,偶數個是0)

比如s = 1111,1010, mask = 1000, s = (1111,1010) ^ (0000,1000) = 1111,0010.

根據規律 x ^ 0 = x, x ^ x = 0, 可以看出,在每一位的運算也是這個規律的 bit ^ bit = 0, bit ^ 0 = bit. 所以當需要把特定位的值取反,把mask中的特定位置1,其他位置0,即可.

#include #define bswap(data, m, n)    \(data & (1

<< m)) == (data & (1

<< n)) ? data : data ^ ((1

<< m) | (1

)

首先看這個巨集定義三目運算符號的後半部分: data ^ ((1 << m) | (1 << n))

上面我們總結到把特定位置取反需要使用mask,在這裡 ((1 << m) | (1 << n)) == mask,會有兩個特定位置需要取反.假設m=4, n =2, mask = 1010, 第4位和第2位需要取反,其他位置保持不變,當data的第4位和第2位的值不同時,和mask進行^運算,正好這兩位的值交換過來,比如

(0000,1000) ^ 1010 = 0000,0010. 但是若第4位和第2位的值相同時,則不能起到交換的效果,比如

(0000,1010) ^ 1010 = 0000,0000. 由或者是:

(0000,0000) ^ 1010 = 0000,1010. 所以當這兩個位元位的值不相同時可以利用異或來進行位元位交換.當這兩個位元位的值相同時,保持不變即可.

所以 由:

(data & (1 << m)) == (data & (1 << n)) ? data : data ^ ((1 << m) | (1 << n))

異或 運算的應用

1.異或運算 關於異或,有兩種計算。一是邏輯異或,一是按位異或。所謂邏輯異或就是運算數是true或者false。比如p1 true,p2 true,p1 p2。按位異或則是將變數轉化為二進位制,每一位分別異或。相同為0,不同為1。按位運算如 優先順序位於關係運算子之後,邏輯運算子之前。好像不經常強調...

異或運算的應用

異或的運用 unique you 2018 03 22 13 31 36 1654 收藏 16 展開異或是一種基於二進位制的位運算,用符號xor或者 表示,其運算法則是對運算子兩側數的每乙個二進位制位,同值取0,異值取1。它與布林運算的區別在於,當運算子兩側均為1時,布林運算的結果為1,異或運算的結...

異或運算的應用

題目 1.將乙個數在二進位制狀態提取最右側的1後這個數為多少 2.提取乙個數轉為二進位制有多少個1 public class intgetrightnumber 怎麼把乙個int型別的數,提取出最右側的1後這個數為多少 static intgetnumber int flag 怎麼提取乙個數轉為二進...