交換兩個(gè)變量的值启具,不使用第三個(gè)變量的四種法方法

交換兩個(gè)變量的值金度,不使用第三個(gè)變量的四種法方法

通常我們的做法是(尤其是在學(xué)習(xí)階段):定義一個(gè)新的變量应媚,借助它完成交換。代碼如下:

inta,b;

a=10; b=15;

int ?t;

t=a; a=b; b=t;

上面的算法最大的缺點(diǎn)就是需要借助一個(gè)臨時(shí)變量猜极。那么不借助臨時(shí)變量可以實(shí)現(xiàn)交換嗎中姜?答案是肯定的!這里我們可以用三種算法來實(shí)現(xiàn):1)算術(shù)運(yùn)算跟伏;2)指針地址操作丢胚;3)位運(yùn)算;4)棧實(shí)現(xiàn)受扳。

1) 算術(shù)運(yùn)算

int ?a,b;

a=10;b=12;

a=b-a;//a=2;b=12

b=b-a;//a=2;b=10

a=b+a;//a=10;b=10

2) 指針地址操作

因?yàn)閷?duì)地址的操作實(shí)際上進(jìn)行的是整數(shù)運(yùn)算携龟,比如:兩個(gè)地址相減得到一個(gè)整數(shù),表示兩個(gè)變量在內(nèi)存中的儲(chǔ)存位置隔了多少個(gè)字節(jié)勘高;地址和一個(gè)整數(shù)相加即“a+10”表示以a為基地址的在a后10個(gè)a類數(shù)據(jù)單元的地址峡蟋。所以理論上可以通過和算術(shù)算法類似的運(yùn)算來完成地址的交換坟桅,從而達(dá)到交換變量的目的。即:

int*a,*b;//假設(shè)*a=newint(10);*b=newint(20);//&a=0x00001000h,&b=0x00001200h

a=(int*)(b-a);//&a=0x00000200h,&b=0x00001200h

b=(int*)(b-a);//&a=0x00000200h,&b=0x00001000h

a=(int*)(b+int(a));//&a=0x00001200h,&b=0x00001000h

3) 位運(yùn)算

int a=10,b=12;//a=1010^b=1100;

a=a^b;//a=0110^b=1100;

b=a^b;//a=0110^b=1010;

a=a^b;//a=1100=12;

b=1010;

^ 按位異或 若參加運(yùn)算的兩個(gè)二進(jìn)制位值相同則為0蕊蝗,否則為1

此算法能夠?qū)崿F(xiàn)是由異或運(yùn)算的特點(diǎn)決定的仅乓,通過異或運(yùn)算能夠使數(shù)據(jù)中的某些位翻轉(zhuǎn),其他位不變匿又。這就意味著任意一個(gè)數(shù)與任意一個(gè)給定的值連續(xù)異或兩次,值不變建蹄,(理論上重載“^”運(yùn)算符碌更,也可以實(shí)現(xiàn)任意結(jié)構(gòu)的交換)。

4)棧實(shí)現(xiàn)洞慎。不多解釋了痛单,棧和相關(guān)函數(shù)定義省去

intexchange(intx,inty)

{

stack S;

push(S,x);

push(S,y);

x=pop(S);

y=pop(S);

}

? ? ?以上算法均實(shí)現(xiàn)了不借助其他變量來完成兩個(gè)變量值的交換,相比較而言算術(shù)算法和位算法計(jì)算量相當(dāng)劲腿,地址算法中計(jì)算較復(fù)雜旭绒,卻可以很輕松的實(shí)現(xiàn)大類型(比如自定義的類或結(jié)構(gòu))的交換,而前兩種只能進(jìn)行整形數(shù)據(jù)的交換(理論上重載“^”運(yùn)算符焦人,也可以實(shí)現(xiàn)任意結(jié)構(gòu)的交換)挥吵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市花椭,隨后出現(xiàn)的幾起案子忽匈,更是在濱河造成了極大的恐慌,老刑警劉巖矿辽,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹允,死亡現(xiàn)場離奇詭異,居然都是意外死亡袋倔,警方通過查閱死者的電腦和手機(jī)雕蔽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宾娜,“玉大人批狐,你說我怎么就攤上這事∏八” “怎么了贾陷?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘱根。 經(jīng)常有香客問我髓废,道長,這世上最難降的妖魔是什么该抒? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任慌洪,我火速辦了婚禮顶燕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冈爹。我一直安慰自己涌攻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布频伤。 她就那樣靜靜地躺著恳谎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憋肖。 梳的紋絲不亂的頭發(fā)上因痛,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音岸更,去河邊找鬼鸵膏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怎炊,可吹牛的內(nèi)容都是我干的谭企。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼评肆,長吁一口氣:“原來是場噩夢啊……” “哼债查!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓜挽,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤攀操,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秸抚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體速和,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年剥汤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颠放。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吭敢,死狀恐怖碰凶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹿驼,我是刑警寧澤欲低,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站畜晰,受9級(jí)特大地震影響砾莱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凄鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一腊瑟、第九天 我趴在偏房一處隱蔽的房頂上張望聚假。 院中可真熱鬧,春花似錦闰非、人聲如沸膘格。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘪贱。三九已至,卻和暖如春辆毡,著一層夾襖步出監(jiān)牢的瞬間菜秦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工胚迫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喷户,地道東北人唾那。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓访锻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闹获。 傳聞我的和親對(duì)象是個(gè)殘疾皇子期犬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 通常我們的做法是(尤其是在學(xué)習(xí)階段):定義一個(gè)新的變量龟虎,借助它完成交換。代碼如下: 這種算法易于理解沙庐,特別適合幫助...
    憤怒的八五磚閱讀 687評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法鲤妥,類相關(guān)的語法,內(nèi)部類的語法拱雏,繼承相關(guān)的語法棉安,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評(píng)論 18 399
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型铸抑。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一贡耽。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,451評(píng)論 3 44
  • 少年鹊汛,你可還記得已經(jīng)走出校門多久了蒲赂?可曾記得這些年是如何摸爬滾打的?曾經(jīng)你是那個(gè)意氣風(fēng)發(fā)的要仗劍走天涯刁憋,去看看這個(gè)...
    洪武先生閱讀 225評(píng)論 0 0
  • 擁有你以后滥嘴, 我再也沒有羨慕過任何人。
    蘇逸之閱讀 212評(píng)論 0 0