不用第三個變數,直接交換兩個變數的值

鴨脖發表於2013-04-24
記得曾經看過不用引進第三個變數而直接變換兩個變數的值的例子。見過的兩種方法如下:
方法一:
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可以發現兩值已經交換



 

這兩種方法表面看起來只是一種技巧,有點小伎倆了,不過在嵌入式的開發上,卻有著極大的作用。因為在嵌入式開發中,空間有限,引入的變數越少,節省的空間也就越多,開發的可利用空間就相對變大了。所以這種技巧是十分常用的一種技巧。


 

對於以上兩種方法簡單分析如下:
方法一中邏輯思維表現得相對明顯一些,可理解性容易一些。方法二在速度上相對快一些,因為是直接利用位運算,所以在時間上表現略有優勢。


 

從數學角度考慮,其實這兩種技巧中都蘊含了集合論的數學思想。可以這樣理解,在方法一中把a+b看作一個大的集合,而從這個集合中減掉一個,所剩下的差集就是另外的一個變數了。同樣的方式,在a+b中減掉另外的一個,也就實現了二者變數值的變換。對於方法二,由於是用數學中的異或運算,所以反覆利用可以得到預期的效果。


 

基於以上分析,可以知道許多開發技巧可以來源於數學理論,這種基於數學理論的應用在技術開發上可以弄出很多東西來,在實際的應用中也有著現實性的意義。雖然“不用第三個變數,直接交換兩個變數的值”的方法不是我想到的,不過相信有了強大數學理論背景之後,在開發以及其他創造性工作中,只要注意培養這種應用意識,我們也能創造出這種“伎倆”來,只要善於思考,善於總結,創造性思維還是可以培養出來的。

 

相關文章