精華區beta C_and_CPP 關於我們 聯絡資訊
作者: mhhsu (Set Limitation ) 看板: Lang_C 標題: [C]SWAP(a,b) 時間: Sun Nov 15 02:03:47 1998 關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。 #define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t)) int main(void) { int a=1,b=2,c; SWAP(a,b,c); return(0); } swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp; } template <class T> void SWAP(class T &a, class T &b) { class T temp; temp = a; a = b; b = temp; } void _swap(char *x, char *y, int sz) { char c; while (sz-- > 0) { c = *x; *x++ = *y; *y++ = c; } } ============================================= 以上都寫的很不錯 ^_^ 不過,演算法都大同小異囉 我來現個醜,提供第五種 void SWAP(int *a,int *b) { *a = *a + *b; *b = *a - *b; *a = *a - *b; } //一樣用三列啦!不過只需兩個變數 -- Anyway, Do the right thing.m -- ※ Origin: 程式設計樂園 ◆ From: r215-77.D5-214.ncu.edu.tw -- 你是一位聰明人嗎?如果是,你該記住,你的聰明是跟那些人學來的, 然後在適當的地點,適當的時間,輕輕的對那人說:這是你教我的。 聲音要輕,而且只告訴他一個人。 摘錄自"牧羊少年奇幻之旅" -- ※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw) ◆ From: DickG.m5.ntu.ed > -------------------------------------------------------------------------- < 作者: DavidYu ( ) 看板: C_and_CPP 標題: Re: [轉錄] swap 時間: Thu Nov 19 06:59:51 1998 ※ 引述《DickG (龍龍)》之銘言: : 關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。 還有一種, a ^= b, b ^= a, a ^= b; 很有趣...不知道是誰想到的...^^;; -- Chia-Hsing David Yu davidyu@ken.csie.ntu.edu.tw Welcome to 橋驛站 -- oio.m1.ntu.edu.tw -- ※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw) ◆ From: oio.m1.ntu.edu. > -------------------------------------------------------------------------- < 作者: cying (應) 看板: C_and_CPP 標題: Re: [轉錄] swap 時間: Thu Nov 19 11:07:57 1998 ※ 引述《DavidYu ( )》之銘言: : ※ 引述《DickG (龍龍)》之銘言: : : 關於交換兩個數的方法,今天在「小魚」哪裡看到了四種。 : 還有一種, : a ^= b, b ^= a, a ^= b; : 很有趣...不知道是誰想到的...^^;; 還有阿: a=a+b b=a-b a=a-b 這樣推理下去的話可以有n個變數 a=a+b+c b=a-b-c c-a-b-c a=a-b-c 就可以對a,b,c三個值做「旋轉」處理完後 b變成原來的a,c變成原來的b,a變成原來的c 這是在某年比賽的筆試中看到的...相當有趣 > -------------------------------------------------------------------------- < 作者: hotball (哲哲魚) 看板: C_and_CPP 標題: Re: [轉錄] swap 時間: Fri Nov 20 02:26:21 1998 ※ 引述《DeanL (遠距通訊)》之銘言: : ※ 引述《hotball (哲哲魚)》之銘言: : : 其實這些方法都是早期的電腦常用的方法,因為那時記憶體不多,多用一個 temp : : 變數似乎太奢侈了,所以才發明了這些方法。不過在當時的電腦上,這些方法會 : : 比用 temp 變數的方法慢一些。 : : 後來的電腦幾乎都會把 swap 的指令做進去,就不需要再這樣做了。 : : 聰明的 compiler 會試圖把「實際上」在做 swap 動作的 code 改成用 swap 指 : : 令去做…… : 意思是不是把code寫得簡單一點,讓compiler看得懂... : 然後他才可以幫你optimize?? : 為什麼C不內建swap的function呢?? 其實要做這麼聰明的 compiler 是很困難的(我也不確定有沒有這種東西) 不過你的第二個問題有點怪怪的……如果 C 要內建 swap 的 function, 那要內建哪種 type 的 swap function?int?還是? 當然在 C++ 裡面有一個 swap 的 template function,不過它基本上是用 t = a; a = b; b = t; 的這種方式寫的。也許有些 implementation 會針對 某些 type (如 int)做 optimization,但是效果可能就很有限。 (要注意絕大部分的 CPU 不能直接 swap 兩個記憶體位址,而所有的變數 理論上是存在記憶體中的) 所以大部分的 compiler 會做到的頂多就是把 t 去掉(例如,它可能會產生: A dd 10 B dw 20 ... mov eax, A mov ebx, B mov A, ebx mov B, eax 事實上,當你在 Visual C++ 6.0 裡面寫 t=a; a=b; b=t; 時,它就會這麼做。 (其實也沒有更快的方法)不過,如果寫 a += b; b= b-a; a-=b; 的話,它就 看不出來了,會真的去算那些數值。這樣就反而比較慢。 -- ※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw) ◆ From: kimicat.m1.ntu.