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

2021-06-21 11:25:33 字數 1073 閱讀 8530

方法一:

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中減掉另外的乙個,也就實現了二者變數值的變換。對於方法二,由於是用數學中的異或運算,所以反覆利用可以得到預期的效果。

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

【分析】

(1)第一種方法有資料溢位的缺陷

(2)可以通過數學上的圖來分析這兩種演算法:

a+b即a與b的並集,然後再a-b即從這個並集中減去b的部分(重合部分算兩份),剩下的就是a。從並集中減去a的部分,剩下的就是b。

a^b就是a和b的非交集的部分(我也不知道數學上怎麼稱呼),然後再異或上b,是什麼意思呢?意思就是兩者不相交的部分,從圖上可以看出,就是a。

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

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

兩個數字交換不用第三個變數

交換函式 注意 雖然不用第三方變數的寫法感覺很牛,但是在複雜的程式環境中容易出現bug 下面會舉例bug 並且技巧性越強的 bug越不好找 因此只需掌握不用第三個變數的思路,平時最好用第三個變數來交換兩個數字 1.常用,最好理解 用第三方變數協助交換 相當於一瓶可樂,一瓶雪碧交換,用乙個空瓶子實現 ...

不用第三個變數進行交換兩數

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 cont...