知識社群
登入
中文(台灣)
English(US)
Q&A
線上人數:
488
AutoCAD開放式教學
社群功能
社群首頁
文件區
(34)
精華區
行事曆
活動
討論區
(454)
即時塗鴉牆
問卷
相簿
(5)
申請加入社群
文件分類
[
總覽
]
未分類
(34)
程式設計相關
常用連結
版主在台灣大學 資工所 系統訓練班的 課程介紹網頁
良葛格的 C語言程式教學講義
社群資訊
訪客: 536998
文章: 34
討論: 454
公告: 2
容量: 剩餘
433 MB
(500 MB)
閱讀權限: 開放
分類:
電腦資訊 / 軟體教學
版主: 高顯忠
副版主: 無
位置:
AutoCAD開放式教學
>
討論區
>
討論
兩個變數的值作 交換的動作
(高顯忠,
sjgau4311@gmail.com
, 2011-04-11 10:43)
1樓
不准 使用第三個變數,
而且,只能夠使用 一個指令
#if 0
a= 210, b= 197
請按任意鍵繼續 . . .
a= 197, b= 210
請按任意鍵繼續 . . .
#endif
// ------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// ------------------------------------------
int main()
{
int a, b;
srand(time(NULL));
a= rand()%1000;
b= rand()%1000;
printf("a= %5d, b= %5d \n", a, b);
system("pause");
// ------------------------------------------
// swap a, b
a^= b^= a^= b;
printf("a= %5d, b= %5d \n", a, b);
system("pause");
// ------------------------------------------
return(0);
}// end of main()
(高顯忠,
sjgau4311@gmail.com
, 2011-04-12 12:28)
2樓
如何只用x,y兩變數來交換彼此數值
int a, b;
a= 123; b= 456;
a^= b^= a^= b;
// 只要 一行指令,不需要使用第三個變數,
即可達到 目的。
請問:為什麼?
※ 引述《ballgi (環給一個幸福)》之銘言:
: 不好意思,我想請教一個問題
: x=1
: y=2
: 如果不用第三個變數就能轉換彼此的數值為
: x=2
: y=1
: 我不知道可以這樣作耶,請問誰能指導我,謝謝
: 在此感謝鄉民提供的智慧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.80.251.64
[1;37m推 [33mnowar100 [m [33m:這方法不好 有 side effect [m 04/11 14:21
[1;31m→ [33mnowar100 [m [33m:分三行寫吧,且我覺得可讀性大輸, [m 04/11 14:22
[1;37m推 [33mYshuan [m [33m:推樓上... [m 04/11 14:36
[1;37m推 [33mledia [m [33m:a^=(b^= (a^=b)) 最裡面那層做完, a 變成 a, b 的 bit diff [m 04/11 14:45
[1;31m→ [33mledia [m [33m:接下來 b^= (bit diff) -> 變成 a, 最後 bit_diff ^= a -> b [m 04/11 14:46
[1;37m推 [33mcismjmgoshr [m [33m:a^a=0, a^b=b^a, (a^b)^c=a^(b^c), a^1=a 大概是這樣 [m 04/11 15:22
[1;31m→ [33mlittleshan [m [33m:不要這樣寫!這是 implementation-defined behavior [m 04/11 15:48
[1;31m→ [33mlittleshan [m [33m:就是十誡之八啦 [m 04/11 15:49
[1;37m推 [33mEbergies [m [33m:而且這個方法速度也比較慢... [m 04/11 15:58
[1;31m→ [33mTsinTa [m [33m:剛剛測了一下,還真的比較慢@@" [m 04/11 16:18
[1;31m→ [33msjgau [m [33m:謝謝 大家的回覆,我大概懂了。等我有空,再來整理一下 [m 04/11 17:15
[1;31m→ [33myoco315 [m [33m:而且就算速度沒有比較慢,
這個實作也存在一個很隱微的bugXD [m 04/11 18:00
[1;31m→ [33myoco315 [m [33m:不過我也不知道這個方法比較慢耶.. 請教一下原因? [m 04/11 18:01
[1;31m→ [33msjgau [m [33m:是否有 side effect, 我會再詳細測試 [m 04/11 18:54
[1;31m→ [33msjgau [m [33m:是否比較慢,我也會再 詳細測試 [m 04/11 18:54
[1;31m→ [33mnowar100 [m [33m:side effect 不是你可以"詳細測試"出來的.... [m 04/11 19:10
[1;37m推 [33mpurpose [m [33m:要做三次xor,加上assignment。tmp=
a; a=b; b=tmp; 做三次 [m 04/11 19:34
[1;31m→ [33mpurpose [m [33m:assignment (mov) 就做完了 [m 04/11 19:34
[1;31m→ [33mkevingwn [m [33m:印象中編出來的asm反而比較長 [m 04/11 22:06
[1;37m推 [33mwowtiger [m [33m:因為對現行的CPU而言 xor 是要三個指令 mov 是沒有指令 [m 04/11 22:06
[1;37m推 [33mlaiis [m [33m:如果只是交換... x=x+y; y=x-y; x=x-y; 這樣如何..? [m 04/11 22:15
[1;37m推 [33mwowtiger [m [33m:跟 xor 是一樣的 除了一些有所謂 xor 特化的 CPU 之外 [m 04/11 22:20
[1;31m→ [33msoftwind [m [33m:就講 不要這樣寫了... 你寫ASM才來考慮這問題 [m 04/12 00:05
[1;31m→ [33mtropical72 [m [33m:我測過,實際上真的慢很多 (for vc6.0 2008 2010) [m 04/12 01:56
© 2010 FormosaSoft Corp.
http://www.powercam.com.tw
service@powercam.com.tw
All rights reserved.
int a, b;
a= 123; b= 456;
a^= b^= a^= b;
// 只要 一行指令,不需要使用第三個變數,
即可達到 目的。
請問:為什麼?
※ 引述《ballgi (環給一個幸福)》之銘言:
: 不好意思,我想請教一個問題
: x=1
: y=2
: 如果不用第三個變數就能轉換彼此的數值為
: x=2
: y=1
: 我不知道可以這樣作耶,請問誰能指導我,謝謝
: 在此感謝鄉民提供的智慧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.80.251.64
[1;37m推 [33mnowar100 [m [33m:這方法不好 有 side effect [m 04/11 14:21
[1;31m→ [33mnowar100 [m [33m:分三行寫吧,且我覺得可讀性大輸, [m 04/11 14:22
[1;37m推 [33mYshuan [m [33m:推樓上... [m 04/11 14:36
[1;37m推 [33mledia [m [33m:a^=(b^= (a^=b)) 最裡面那層做完, a 變成 a, b 的 bit diff [m 04/11 14:45
[1;31m→ [33mledia [m [33m:接下來 b^= (bit diff) -> 變成 a, 最後 bit_diff ^= a -> b [m 04/11 14:46
[1;37m推 [33mcismjmgoshr [m [33m:a^a=0, a^b=b^a, (a^b)^c=a^(b^c), a^1=a 大概是這樣 [m 04/11 15:22
[1;31m→ [33mlittleshan [m [33m:不要這樣寫!這是 implementation-defined behavior [m 04/11 15:48
[1;31m→ [33mlittleshan [m [33m:就是十誡之八啦 [m 04/11 15:49
[1;37m推 [33mEbergies [m [33m:而且這個方法速度也比較慢... [m 04/11 15:58
[1;31m→ [33mTsinTa [m [33m:剛剛測了一下,還真的比較慢@@" [m 04/11 16:18
[1;31m→ [33msjgau [m [33m:謝謝 大家的回覆,我大概懂了。等我有空,再來整理一下 [m 04/11 17:15
[1;31m→ [33myoco315 [m [33m:而且就算速度沒有比較慢,
[1;31m→ [33myoco315 [m [33m:不過我也不知道這個方法比較慢耶.. 請教一下原因? [m 04/11 18:01
[1;31m→ [33msjgau [m [33m:是否有 side effect, 我會再詳細測試 [m 04/11 18:54
[1;31m→ [33msjgau [m [33m:是否比較慢,我也會再 詳細測試 [m 04/11 18:54
[1;31m→ [33mnowar100 [m [33m:side effect 不是你可以"詳細測試"出來的.... [m 04/11 19:10
[1;37m推 [33mpurpose [m [33m:要做三次xor,加上assignment。tmp=
[1;31m→ [33mpurpose [m [33m:assignment (mov) 就做完了 [m 04/11 19:34
[1;31m→ [33mkevingwn [m [33m:印象中編出來的asm反而比較長 [m 04/11 22:06
[1;37m推 [33mwowtiger [m [33m:因為對現行的CPU而言 xor 是要三個指令 mov 是沒有指令 [m 04/11 22:06
[1;37m推 [33mlaiis [m [33m:如果只是交換... x=x+y; y=x-y; x=x-y; 這樣如何..? [m 04/11 22:15
[1;37m推 [33mwowtiger [m [33m:跟 xor 是一樣的 除了一些有所謂 xor 特化的 CPU 之外 [m 04/11 22:20
[1;31m→ [33msoftwind [m [33m:就講 不要這樣寫了... 你寫ASM才來考慮這問題 [m 04/12 00:05
[1;31m→ [33mtropical72 [m [33m:我測過,實際上真的慢很多 (for vc6.0 2008 2010) [m 04/12 01:56