題目:將a 與 b的值互換。程序員
一般咱們的作法是(尤爲是在學習階段):定義一個新的變量,藉助它完成交換。代碼以下:
int a,b;
a; b;
int t;
t=a; a=b; b=t;
這種算法易於理解,特別適合幫助初學者瞭解計算機程序的特色,是賦值語句的經典應用。在實際軟件開發當中,此算法簡單明瞭,不會產生歧義,便於程序員之間的交流,通常狀況下碰到交換變量值的問題,都應採用此算法(如下稱爲標準算法)。算法
上面的算法最大的缺點就是須要藉助一個臨時變量。那麼不借助臨時變量能夠實現交換嗎?答案是確定的!學習
1) 算術運算
簡單來講,就是經過普通的+和-運算來實現。代碼以下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
經過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,可是不容易想到,尤爲是在習慣標準算法以後。
它的原理是:把a、b看作數軸上的點,圍繞兩點間的距離來進行計算。
具體過程:第一句「a=b-a」求出ab兩點的距離,而且將其保存在a中;第二句「b=b-a」求出a到原點的距離(b到原點的距離與ab兩點距離之差),而且將其保存在b中;第三句「a=b+a」求出b到原點的距離(a到原點距離與ab兩點距離之和),而且將其保存在a中。完成交換。
此算法與標準算法相比,多了三個計算的過程,可是沒有藉助臨時變量。(如下稱爲算術算法)開發
該算法還能夠這樣作:變量
int a,b;原理
a=10;b=12;軟件
a=a+b=22;程序
b=a-b=10;數據
a=a-b=12;計算機
兩個減操做一個加操做,執行的前後順序不同,其原理也稍微有些區別,但根本原理是同樣滴。
3) 位運算
經過異或運算也能實現變量的交換,這也許是最爲神奇的,請看如下代碼:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此算法可以實現是由異或運算的特色決定的,經過異或運算可以使數據中的某些位翻轉,其餘位不變。這就意味着任意一個數與任意一個給定的值連續異或兩次,值不變。
即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理能夠獲得a=b^a^a=b;輕鬆完成交換。
以上三個算法均實現了不借助其餘變量來完成兩個變量值的交換,相比較而言算術算法和位算法計算量至關,地址算法中計算較複雜,卻能夠很輕鬆的實現大類型(好比自定義的類或結構)的交換,而前兩種只能進行整形數據的交換(理論上重載「^」運算符,也能夠實現任意結構的交換)。