當要交換兩個數的值時,通常的做法是定義乙個臨時變數,然後再進行交換。那麼能不能不用臨時變數而交換兩個數的值呢?可以的!c語言提供的異或運算就可以實現這樣的操作。
異或運算子^也稱xor運算子,它的規則是若參加運算的兩個二進位同號,則結果為0(假);異號為1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0。
例:#
include
int main(
int argc,
char
*argv)
結果如下:
a = 6 b = 2
分析:前兩個賦值語句:「a = a ^ b;」和「b = b ^ a;」相當於b = b ^ (a ^ b),而b ^ a ^ b等於a ^ b ^ b。b ^ b的結果為0,因為同乙個數與相向相^,結果必為0。因此b的值等於a ^ 0,即a,其值為2。
再執行第三個賦值語句:「a = a ^ b」。由於a的值等於(a ^ b),b的值等於(b ^ a ^ b),因此,相當於a = a ^ b ^ b ^ a ^ b,即a的值等於a ^ a ^ b ^ b ^ b,等於b。
2007.06.02
今天又發現另外兩種方法,特補上。
方法一void
swap
(int
*p,int
*q)
方法二void
swap
(int
*p,int
*q)
原理為算術運算子的結合順序為自左至右。
不用臨時變數交換兩個數的值
就地交換兩個數是比較經典而且基礎的演算法之一。我們要交換兩個數字,通常的做法就建立乙個中間變數,然後進行迴圈賦值,比如說下面的 void switch int p1,int p2 這種做法是最常見的一種交換兩個數字的方法,但研究演算法的人總是會提出比較詭異的問題,比如說在手持裝置中,記憶體資源很寶貴...
不用臨時變數交換兩個數的值
就地交換兩個數是比較經典而且基礎的演算法之一。我們要交換兩個數字,通常的做法就建立乙個中間變數,然後進行迴圈賦值,比如說下面的 void switch int p1,int p2 這種做法是最常見的一種交換兩個數字的方法,但研究演算法的人總是會提出比較詭異的問題,比如說在手持裝置中,記憶體資源很寶貴...
怎樣不用中間變數temp 實現兩個數交換
第一類方法也是常用的方法,通過多次的數值計算來完成交換,到現在知道的有下面三種 1 加減法。a a b b a b a a b 該方法可以交換整型和浮點型數值的變數,但在處理浮點型的時候有可能出現精度的損失,例如對資料 a 3.123456 b 1234567.000000 交換後各變數值變為 a ...