【C++】怎樣不用中間變數temp 實現兩個數交換

來源:互聯網
上載者:User

 

第一類方法也是常用的方法,通過多次的數值計算來完成交換,到現在知道的有下面三種:

(1)加減法。

a = a + b;

b = a - b;

a = a - b;

該方法可以交換整型和浮點型數值的變數,但在處理浮點型的時候有可能出現精度的損失,例如對資料:

a = 3.123456

b = 1234567.000000

交換後各變數值變為:

a = 1234567.000000

b = 3.125000

很明顯,原來a的值在交換給b的過程中發生了精度損失。

(2)乘除法。

a = a * b;

b = a / b;

a = a / b;

乘除法更像是加減法向乘除運算的映射,它與加減法類似:可以處理整型和浮點型變數,但在處理浮點型變數時也存在精度損失問題。而且乘除法比加減法要多一條約束:b必不為0。

可能經驗上的某種直覺告訴我們:加減法和乘除法可能會溢出,而且乘除的溢出會特別嚴重。其實不然,採用這兩種方法都不會溢出。以加減法為例,第一步的加運算可能會造成溢出,但它所造成的溢出會在後邊的減運算中被溢出回來。

(3)異或法。

a ^= b;//a=a^b

b ^= a;//b=b^(a^b)=b^a^b=b^b^a=0^a=a

a ^= b;//a=(a^b)^a=a^b^a=a^a^b=0^b=b

異或法可以完成對整型變數的交換,對於浮點型變數它無法完成交換。

第二類方法更像是玩了一個文字遊戲,此種方法採用了在代碼中嵌入彙編代碼的方法避免了臨時變數的引入,但究其本質還是會使用額外的儲存空間。此種方法可以有很多種,下邊列出幾種:

(1)使用xchg指令,這也是比較直觀、容易想到的方法,因為xchg指令的功能就是交換源運算元和目的運算元的值,這裡要使用額外寄存器來暫存變數。內嵌彙編代碼如下:

_asm

{

mov eax,a

xchg b,eax

mov a,eax

}

(2)使用額外的棧。這裡使用反向的出棧順序來完成交換。內嵌代碼有如下兩種形式:

_asm

{

push a

push b

pop a

pop b

}

另一種形式:

_asm push a

a = b;

_asm pop a

(3)使用mov指令。這種方法使用額外寄存器來暫存一個變數的值。

_asm mov eax,a

a = b;

_asm mov b,eax

其實第二類方法並不合格,它雖然沒有顯式的使用臨時變數,但還是會用到額外的存貯空間。不過也不能說沒有必要掌握,從實用的角度看還是很“有用”的。不是有公司出過這樣的面試題嗎?“不使用加減法和異或法完成不使用中間變數交換兩個數值型變數的值”。此時或許只好使用這種方法了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.