異或運算實現兩數交換

2021-09-26 11:55:56 字數 1326 閱讀 6515

在《演算法競賽入門經典(第2版)》p9,介紹了三種交換兩個數的方法。

(1)三變數法:

#incldueusing namespace std;

int main()

(2)不借助其他變數

#incldueusing namespace std;

int main()

(3)異或運算

異或(^)是乙個數**算符。它應用於邏輯運算。異或的數學符號為「⊕」,計算機符號為「xor」。

其運算法則為:

a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。

異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法:二進位制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進製,所以異或常被認作不進製加法。

a ⊕ a = 0

a ⊕ b = b ⊕ a

a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;

d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.ab

a^b101

1100

0001

1以1314^996為例:

1314化為二進位制為0000 0101 0010 0010

996化為二進位制為0000 0011 1110 0100

對二進位制的1和4 進行不進製的加法 結果為0000 0110 1100 0110

化為十進位制為1734

所以1314^996=1734

#includeusing namespace std;

int main()

也可以簡寫為:a^=b^=a^=b

在筆者查閱異或運算時,遇到了下面的說法:

在利用異或運算交換兩數時,如果兩數相等,則不能實現交換。

筆者認為兩數相等並不影響兩數異或法交換,真正影響的應該是兩數的位址相同。

#includeusing namespace std;

int main()

{ int a=1;

a^=a^=a^=a;

cout《執行結果為0;

也就是說,不管a的值是多少,因為a^a=0恆成立,所以就丟失了a原來的值。

而如果兩個數相等,經過一次異或運算後有乙個數為0,而另乙個數仍保持著原來的數值。所以並沒有影響。↩︎

使用異或實現兩數交換

如果a b兩個值不相同,則異或結果為1。如果a b兩個值相同,異或結果為0。異或也叫半加運算,其運算法則相當於不帶進製的二進位制加法 二進位制下用1表示真,0表示假,則異或的運算法則為 0 0 0,1 0 1,0 1 1,1 1 0 同為0,異為1 這些法則與加法是相同的,只是不帶進製,所以異或常被...

異或運算進行兩數交換

直接上 swap int a,int b 解析 此方法簡潔明瞭。先來講一下異或運算的性質 異或運算可看做不進製的加法!1 任何數異或自身等於0。因為自身就是兩個相同的數相加,每一位都一樣,要麼0要麼1,1 1和0 0按照不進製加法就是0 2 任何數異或0都等於自身。這個很好理解,任何數加0都等於本身...

異或運算實現兩個數的交換

通常的交換兩個變數a,b的過程為 int temp temp a a b b temp 需借助上面的第3個臨時變數temp.採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變數 a a b b a b a a b 這個交換兩個變數而無需借助第3個臨時變...