無參運算小記

void swap(int *p1,int *p2){
*p1 = p1^p2;
*p2 = p1^p2;
*p1 = p1^p2;
}


這是在 [我是蔡金龍](http://www.reibang.com/users/e36540d0451c) 的文章 *[C語言的位操作(One)](http://www.reibang.com/p/73da7e180795) *里關(guān)于無參運算的一個例子救巷,這一個函數(shù)的特點是在沒有引入臨時變量(temporary variable)的前提下對兩個變量的內(nèi)容進行交換群叶。

而這是怎么做到的呢?以下是對這個函數(shù)的注釋

void swap(int *p1,int *p2){ // 假設(shè) p1 的補碼為 1011赁还,p2 為 0001
*p1 = *p1 ^ *p2; // 此時 *p1 為 1010 (1011 ^ 0001 == 1010)
*p2 = *p1 ^ *p2; // 此時 *p2 為 1011 (1010 ^ 0001 == 1011)
*p1 = *p1 ^ *p2; // 此時 *p1 為 0001 (1010 ^ 1011 == 0001)
}

觀察注釋后就會發(fā)現(xiàn),當 \*p1 和 \*p2 這兩個參數(shù)進行位間的異或運算(^)時廊宪,會得出一個很有趣的結(jié)果(在這個例子中是 1010)摹闽,這個結(jié)果與原參數(shù)(\*p1,\*p2)構(gòu)成一個互異關(guān)系(這個詞是自創(chuàng)的)泽示。換句話來說,對著三個參數(shù)中的任意兩個參數(shù)進行位間的異或運算蜜氨,都能夠得到余下的第三個參數(shù)械筛。因此,在同一時間里飒炎,只需要“記住”其中的兩個參數(shù)埋哟,就可以保證信息的完整性,從而不需要第三變量的引入郎汪。

--------------------

想到這個過程用圖像來表示可能會更直觀一些赤赊,于是就做了一個維恩圖(Venn diagram)的表示。

注意其中的 \*pt 其實就是運行函數(shù)中第一行之后的 \*p1煞赢,而位異或運算(a ^ b)在韋恩圖里可以表示為 ~(a ^ b) 【此 ^ 非彼 ^】

PS. 在制圖時犯了一個嚴重的錯誤抛计,在圖中的全集應(yīng)當是 \*p1 和 \*p2的交集 (\*p1 U \*p2 == U),所以**請無視圓和長方形之間區(qū)域**

![](http://upload-images.jianshu.io/upload_images/2157068-3a18d015b2ad2717.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

(原來的那篇因為沒有用 markdown照筑,結(jié)果弄不了 code block吹截。于是就刪掉然后用 markdown 再發(fā)了一遍,Orz)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朦肘,一起剝皮案震驚了整個濱河市饭弓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媒抠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏花,死亡現(xiàn)場離奇詭異趴生,居然都是意外死亡,警方通過查閱死者的電腦和手機昏翰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門苍匆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棚菊,你說我怎么就攤上這事浸踩。” “怎么了统求?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵检碗,是天一觀的道長据块。 經(jīng)常有香客問我,道長折剃,這世上最難降的妖魔是什么另假? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮怕犁,結(jié)果婚禮上边篮,老公的妹妹穿的比我還像新娘。我一直安慰自己奏甫,他們只是感情好戈轿,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阵子,像睡著了一般凶杖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上款筑,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天智蝠,我揣著相機與錄音,去河邊找鬼奈梳。 笑死杈湾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的攘须。 我是一名探鬼主播漆撞,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼于宙!你這毒婦竟也來了浮驳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捞魁,失蹤者是張志新(化名)和其女友劉穎至会,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谱俭,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奉件,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昆著。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片县貌。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凑懂,靈堂內(nèi)的尸體忽然破棺而出煤痕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布摆碉,位于F島的核電站塘匣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兆解。R本人自食惡果不足惜馆铁,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锅睛。 院中可真熱鬧埠巨,春花似錦、人聲如沸现拒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽印蔬。三九已至勋桶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侥猬,已是汗流浹背例驹。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留退唠,地道東北人鹃锈。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瞧预,于是被迫代替她去往敵國和親屎债。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法垢油,類相關(guān)的語法盆驹,內(nèi)部類的語法,繼承相關(guān)的語法滩愁,異常的語法躯喇,線程的語...
    子非魚_t_閱讀 31,633評論 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,812評論 1 10
  • (1) 房間里的劉磊窩在那個看上去有些年代的沙發(fā)上,整個房間昏昏暗暗的惊楼,窗戶被窗簾擋住了玖瘸,什么都照不進來。 劉磊看...
    F_先生閱讀 347評論 0 0
  • 【蝸牛計劃檀咙,每天進步一點點】 我是清泉 打卡日期:2017年8月20日 打卡天數(shù):第51天 (1)我今年的三個年度...
    沈曼柔閱讀 517評論 0 0