寫在前面web
在小編辛辛苦苦擼了一個月C語言以後,屁顛屁顛跑去老師面前想裝個B。老師說哎那你說說怎麼實現兩個數的交換?這TM不太簡單了嘛。當小編把代碼給老師看的時候,老師蛋蛋一笑,眼神裏充滿了關愛,而後來了一句:這麼low的代碼都能寫出來,你內心難道沒有一點逼數嘛?編程
而後小編只好一臉懵逼回去baidu一下了。沒想到一查,臥槽這裏面的學問大着呢。
微信
引言函數
咱們在學習編程過程當中時常會遇到須要交換兩個數據的問題,那麼咱們該怎樣去完成對兩個數據的交換呢?例如,a=12 b=8如何讓a變爲8,b變爲12呢?在這過程當中咱們也要好好體會交換過程當中體現的思惟方式和計算機的執行規則。話很少說,下面進入咱們具體的內容:學習
NO.1藉助中間變做爲中間過渡url
int a=12,b=8,temp;spa
temp = a; //將a的值賦給temp做爲中間過渡,即temp=12.net
a = b; //將b的值賦給a,即a所分配的內存裏的數變爲了83d
b = temp; //b的值變爲了12orm
這是最簡單的交換方法了,是賦值語句的經典應用!應該是我的都能看懂的吧?
那,能不能把這個功能作成一個函數?嗯,憋說話。先看代碼:
該實現方法是將a和b的地址發送給p和q,即p,q中存放的是a,b的地址。p指向a,q指向b,swap函數經過間址訪問來對a和b的內容進行修改,從而交換了a和b的值。
可是若是不是發送a和b的地址,而是直接發送a和b的值,狀況會怎樣?
(程序右邊)這樣子的話並不能交換a和b的值。爲何呢?這是由於主函數調用swap函數時會爲其中的變量在棧堆中分配的內存,但在主函數調用完swap函數時,其佔的內存會被釋放掉。即一開始p和q的內存空間裏是12和8。Swap函數交換的也只是p和q的值,a和b的值並無改變。
NO.2經過算術變換來實現
該方法不須要中間變量,思惟方式顯得很高大上,B格天然就高了一點!
其基本原理仍是迭代的方法,是將兩個數的和減去其中一個數等於另外一個數;看不懂的仔細推導一下就能明白。另外,在這裏請讀者自行思考,是否能夠用乘除運算來實現呢?!
NO.3經過按位異或邏輯運算來實現
這個方法就有點高大上了,貌似曾經還做爲百度仍是阿里的筆試題。
爲此,先介紹一下啥是異或運算,他有什麼特色能夠用來交換兩個數!
邏輯異或運算能夠簡單理解爲:
當兩個邏輯數(0和1)相同時,異或結果爲假即0。
而當兩個邏輯數不相同時,異或結果爲真即1.
這裏簡單點記就是:同性戀(兩個數相同)不容許。異性戀(兩個數不一樣)容許。
在計算機中用 ^ 來表示按位異或運算。如:
0^0=0,
1^0=1,
101110^100010=001100
下面一步一步爲你們解釋這個過程:
①初始,a=1100(二進制),b=1000(二進制)
②執行a = a^b 以後,a值變爲0100
a 1100
b 1000
xor 0100
③執行b = a^b 以後,b值變爲1100
a 0100
b 1000
xor 1100
④執行a = a^b 以後,a值變爲1000
a 0100
b 1100
xor 1000
此時,ab的值已經實現交換了。done!
以上四種方法只是都是值得咱們好好去思考的方法,多點想象對咱們的思惟老是有幫助的!咱們也期待同窗們想到其餘更有意思的方法!
寫在後面
好了,來講說前兩種的缺點吧。
第一種,必須得藉助中間變量來交換,開闢給temp的內存,有點浪費空間!
第二種,可是當a和b的數值很大時,a+b就可能會溢出,致使結果出錯!
END
編輯 /華南理工大學本科一年級@李銳標
排版 /華中科技大學本科一年級@鄧發珩
若有疑問,歡迎諮詢:李銳標 (聯繫方式:2961347734@qq.com 公衆號:程序猿聲)
本文分享自微信公衆號 - 程序猿聲(ProgramDream)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。