#include
#include
using
namespace
std;
int main ()
d=c*d;
c=d/c;
d=d/c;
cout
<<"c = "
<< c <"d = "
<< da=a^b;
b=a^b;
a=a^b;
cout
<<"a = "
<< a <"b = "
<< ba = 3
b = 2
c = 3
d = 2
a = 2
b = 3
press any key to continue
考慮另外一種儲存方式,用乙個變數儲存兩個資訊的集合,用另外乙個變數儲存任意乙個資訊,這種儲存方式就可以完成交換的工作。
上面這段話很抽象,我們用為**來表示
// 現在有兩個變數a, b,我使得
a = [a,b] // a 等於ab兩個資訊的集合
b = b // b 還是 b
這種表示方法,我們儲存了兩個資訊,但儲存方式不一樣,我們需要對資訊進行提取,例如我們要a時,則
c = a 去除 b
如果還是不明白這種儲存方式,那麼我直接給出就地交換的演算法:
void switch(int* p1, int* p2)
上面的**看起來有點煩? 把指標去掉看吧:
int a = 1;
int b = 2;
a = a + b;
b = a - b;
a = a - b;
這個思路很巧妙,但也存在一定問題: 萬一溢位了怎麼辦?
到目前為止,我們的答題思路是沒錯的,就是尋找另外一種資料儲存的模式,用乙個變數儲存兩條資訊的集合,我們仍然需要採用這種模式解決這個問題,但原先的簡單相加的模式是不行了,於是我們想到,集合兩個整型數字,是否可以從其二進位制表達方面來考慮?
我們可以使用位異或來儲存集合資訊。 用 1 和 0 來做簡單的驗證,看是否可以用異或的方式,儲存資訊的集合:
如果兩個數是a = 1和b = 0,則:
集合 = 1
0 異或 集合 = 1
1 異或 集合 = 0
如果 a = 1 & b = 1
集合 = 0
1 異或 集合 = 1
如果 a = 0 & b = 0
集合 = 0
0 疑惑 集合 = 0
驗證結果: 可以採用資訊集合的方式儲存
那麼我們的交換**可以變成:
int a = 10;
int b = 50;
a = a ^ b; // 構建集合
b = a ^ b; // 取出集合的另乙個元素
a = a ^ b; // 取出集合的另乙個元素
這種方式不用擔心資料溢位,應該算是就地交換兩個數的最佳解決方案了。
兩個數字交換不用第三個變數
交換函式 注意 雖然不用第三方變數的寫法感覺很牛,但是在複雜的程式環境中容易出現bug 下面會舉例bug 並且技巧性越強的 bug越不好找 因此只需掌握不用第三個變數的思路,平時最好用第三個變數來交換兩個數字 1.常用,最好理解 用第三方變數協助交換 相當於一瓶可樂,一瓶雪碧交換,用乙個空瓶子實現 ...
不用第三個變數,直接交換兩個變數的值
記得曾經看過不用引進第三個變數而直接變換兩個變數的值的例子。見過的兩種方法如下 方法一 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 方法二 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 這兩...
不用第三個變數,直接交換兩個變數的值
方法一 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 方法二 var a 1 var b 2 a a b b a b a a b 輸出a,b可以發現兩值已經交換 這兩種方法表面看起來只是一種技巧,有點小伎倆了,不過在嵌入式的開發上,卻有著極大的作...