久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 21957|回復(fù): 80
打印 上一主題 下一主題
收起左側(cè)

不用中間數(shù)交換兩個(gè)變量的方法

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:282850 發(fā)表于 2019-11-26 10:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 f556 于 2019-11-26 10:50 編輯

再次翻看多年前的日志,看到自己記錄的算法,聯(lián)想到前些天論壇有人問了一個(gè)簡(jiǎn)單的問題:“怎么交換兩組數(shù)?”
當(dāng)時(shí)有人回答用中間變量,這是一種常用的方法。這個(gè)思路好比以下例子:一杯果汁A、一碗牛奶B,現(xiàn)在要互換一下容器,即把A換到碗里,B換到杯里。只有借助第3個(gè)容器C。操作是A--->C,B---->A,C----->B,這樣才能完成交換。
有人回答用加減法,思路不錯(cuò):
a=3;b=5;
a=a+b;         
b=a-b;
a=a-b;
但當(dāng)時(shí)我提出有溢出問題,如235+122怎么辦,設(shè)定a、b均為unsigned char;如果均為unsigned int同樣有問題,不能用程序來限定a、b值的范圍,特別是ADC的值。

我日志記錄的不用中間數(shù)交換兩個(gè)變量的方法,均利用C語言的異或運(yùn)算。
異或邏輯:對(duì)應(yīng)的位相比較,同=0,異=1,實(shí)際上可以理解就“按位求異”,即“異為真,同為假”
舉例:
xxxx 1001  ^   0000 1111 = xxxx 0110(后4位翻轉(zhuǎn))
xxx1 xxxx  ^      1 0000 =xxx0 xxxx   
xxx0 xxxx  ^      1 0000 =xxx1 xxxx  

程序如下:
unsigned int aa=3456,bb=7890;
void main( void )
{
  aa=aa^bb;
  bb=bb^aa;
  aa=aa^bb;
}
運(yùn)行結(jié)果見圖片。

stest.jpg (102.67 KB, 下載次數(shù): 291)

還未運(yùn)行

還未運(yùn)行

stest2.jpg (62.3 KB, 下載次數(shù): 314)

運(yùn)行完

運(yùn)行完

評(píng)分

參與人數(shù) 4黑幣 +66 收起 理由
6789364 + 6 絕世好帖!
lenvov + 5 很給力!
八月初 + 5 厲害,佩服你的思路
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂10 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:645890 發(fā)表于 2019-11-28 08:36 | 只看該作者
夭壽,答案確實(shí)如此為何腦子還是轉(zhuǎn)不太過來。
回復(fù)

使用道具 舉報(bào)

板凳
ID:190832 發(fā)表于 2019-11-30 12:33 | 只看該作者
這個(gè)太厲害了,精彩
回復(fù)

使用道具 舉報(bào)

地板
ID:654169 發(fā)表于 2019-12-2 12:35 | 只看該作者
好厲害,電賽初學(xué)者剛好
回復(fù)

使用道具 舉報(bào)

5#
ID:656472 發(fā)表于 2019-12-5 09:22 | 只看該作者
沒看懂啊!!!
回復(fù)

使用道具 舉報(bào)

6#
ID:540262 發(fā)表于 2019-12-10 09:49 來自觸屏版 | 只看該作者
神仙算法
回復(fù)

使用道具 舉報(bào)

7#
ID:282850 發(fā)表于 2019-12-10 17:07 | 只看該作者
解釋一下,試算:
a=2   ----b 10
b=3   ----b 11             以下用二進(jìn)制
a=a^b=10^11=01     這個(gè)數(shù)相當(dāng)于一個(gè)中間值,不是原a,也不是原b
b=b^a=11^01=10  ---->2     使用了中間值01 (a)
a=a^b=01^10=11  ----->3     使用了中間值01 ,也使用了交換好的b

異或象加法一樣,不分先后順序
改程序如下圖,也可

sss.jpg (21.03 KB, 下載次數(shù): 271)

sss.jpg
回復(fù)

使用道具 舉報(bào)

8#
ID:663421 發(fā)表于 2019-12-13 17:59 | 只看該作者
牛逼,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

9#
ID:653902 發(fā)表于 2019-12-16 08:51 | 只看該作者
這種交換方法有一個(gè)前提,就是aa和bb不能相等,如果相等,則會(huì)得出錯(cuò)誤的結(jié)果。所以在做異或運(yùn)算前,需要進(jìn)行判斷。
回復(fù)

使用道具 舉報(bào)

10#
ID:282850 發(fā)表于 2019-12-17 14:13 | 只看該作者
rotga 發(fā)表于 2019-12-16 08:51
這種交換方法有一個(gè)前提,就是aa和bb不能相等,如果相等,則會(huì)得出錯(cuò)誤的結(jié)果。所以在做異或運(yùn)算前,需要進(jìn) ...

真的嗎?純屬你的主觀意斷!
回復(fù)

使用道具 舉報(bào)

11#
ID:282850 發(fā)表于 2019-12-17 14:18 | 只看該作者
否定樓上的想當(dāng)然,兩個(gè)相同數(shù)的交換。見運(yùn)行圖片
人算:
a=1;  b=1;
a=a^b=0;
b=a^b=0^1=1;
a=a^b=0^1=1;
錯(cuò)在哪里!

ssss.jpg (52.97 KB, 下載次數(shù): 225)

ssss.jpg
回復(fù)

使用道具 舉報(bào)

12#
ID:351097 發(fā)表于 2019-12-20 15:56 | 只看該作者
你這種方法雖然可行,涉及到異或處理,編譯出的匯編代碼會(huì)比中間變量法多一些,這樣的話,單片機(jī)就需要花更多是時(shí)間去處理,可以說效率低。而且這樣寫,代碼的可讀性非常差。
回復(fù)

使用道具 舉報(bào)

13#
ID:669731 發(fā)表于 2019-12-21 12:37 | 只看該作者
多學(xué)一種思路,至少以后看的懂 謝謝樓主的講解 樓主說的兩種我看過,這個(gè)沒看過
回復(fù)

使用道具 舉報(bào)

14#
ID:653902 發(fā)表于 2019-12-22 22:26 | 只看該作者
如果只是在main中這樣做,結(jié)果沒有問題,但是在實(shí)際編程中,以調(diào)用函數(shù)的方式,那么只能用指針傳遞實(shí)參,如果兩個(gè)數(shù)值相等的話,這樣就會(huì)出錯(cuò)。你可以試一試。
回復(fù)

使用道具 舉報(bào)

15#
ID:653902 發(fā)表于 2019-12-22 22:54 | 只看該作者
#include <stdio.h>
void swap(int *a,int *b)
{
        *a^=*b;
        *b^=*a;
        *a^=*b;

}
void main(void)
{
        int test[2] = {21,23};
        swap(&test[0],&test[0]);
        printf("test[0]=%d test[1]=%d",test[0],test[1]);
}
運(yùn)行結(jié)果:test[0]=0 test[1]=23
回復(fù)

使用道具 舉報(bào)

16#
ID:673561 發(fā)表于 2019-12-25 15:29 | 只看該作者
學(xué)到了,很有幫助,這個(gè)平臺(tái)很不錯(cuò)
回復(fù)

使用道具 舉報(bào)

17#
ID:282850 發(fā)表于 2019-12-27 16:31 | 只看該作者
rotga 發(fā)表于 2019-12-22 22:54
#include
void swap(int *a,int *b)
{

你程序有一句明顯錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

18#
ID:664974 發(fā)表于 2019-12-27 22:18 來自觸屏版 | 只看該作者
太麻煩了
回復(fù)

使用道具 舉報(bào)

19#
ID:282850 發(fā)表于 2019-12-28 12:36 | 只看該作者
rotga 發(fā)表于 2019-12-22 22:54
#include
void swap(int *a,int *b)
{

有一個(gè)語句明顯錯(cuò)了,請(qǐng)改正。
另外,我個(gè)人非常厭惡printf,這個(gè)純無用的垃圾語句。從你用printf可以看出受了唐大師的毒害,還是重新找本書或者混一下網(wǎng)站、論壇。
回復(fù)

使用道具 舉報(bào)

20#
ID:653902 發(fā)表于 2019-12-31 10:08 | 只看該作者
不是明顯錯(cuò)了,而是模擬在復(fù)雜環(huán)境里面,很有可能產(chǎn)生待比較的兩個(gè)數(shù)的指針指向同一地址,而結(jié)果你也看到了,是否和你之前想象的結(jié)果一致?你的心態(tài)很浮躁,我的水平是不高,但三人行必有我?guī)熝伞J欠衲阏J(rèn)為給你指出潛在的錯(cuò)誤邏輯只能是水平比你高的人才有資格?這個(gè)帖子我無意和你扯這些口舌之爭(zhēng)。如果技術(shù)上還有需討論的地方,歡迎發(fā)表觀點(diǎn)。關(guān)于用異或交換數(shù)字,是個(gè)思路,但第一,對(duì)于直接交換,如果操作對(duì)象是同一個(gè)數(shù),會(huì)有錯(cuò)誤結(jié)果。第二,運(yùn)行效率低,代碼可讀性差。這個(gè)早已是定論。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
zpmpok001 + 5

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

21#
ID:676429 發(fā)表于 2019-12-31 10:33 | 只看該作者
好厲害,初學(xué)者剛好
回復(fù)

使用道具 舉報(bào)

22#
ID:328200 發(fā)表于 2020-1-11 12:11 | 只看該作者
#include <stdio.h>
void swap(int *a,int *b)
{
        *a^=*b;
        *b^=*a;
        *a^=*b;

}
void main(void)
{
        int test[2] = {21,21};
        swap(&test[0],&test[1]);
        printf("test[0]=%d test[1]=%d",test[0],test[1]);
}
運(yùn)行結(jié)果:
test[0]=21 test[1]=21Press any key to continue
回復(fù)

使用道具 舉報(bào)

23#
ID:392682 發(fā)表于 2020-1-17 11:05 | 只看該作者
感謝,漲知識(shí)了
回復(fù)

使用道具 舉報(bào)

24#
ID:348676 發(fā)表于 2020-1-20 16:11 | 只看該作者
學(xué)習(xí)了,很有幫助
回復(fù)

使用道具 舉報(bào)

25#
ID:348676 發(fā)表于 2020-1-20 16:30 | 只看該作者
rotga 發(fā)表于 2019-12-16 08:51
這種交換方法有一個(gè)前提,就是aa和bb不能相等,如果相等,則會(huì)得出錯(cuò)誤的結(jié)果。所以在做異或運(yùn)算前,需要進(jìn) ...

相等就不用交換了
回復(fù)

使用道具 舉報(bào)

26#
ID:497328 發(fā)表于 2020-2-2 20:11 | 只看該作者
這么好的貼子不頂不行
回復(fù)

使用道具 舉報(bào)

27#
ID:689598 發(fā)表于 2020-2-3 01:00 | 只看該作者
不具通用性,只能在特殊場(chǎng)景里使用
回復(fù)

使用道具 舉報(bào)

28#
ID:692149 發(fā)表于 2020-2-15 13:18 | 只看該作者
這個(gè)方法好,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

29#
ID:575679 發(fā)表于 2020-2-15 15:07 | 只看該作者
謝謝大佬 學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

30#
ID:507431 發(fā)表于 2020-2-20 13:32 | 只看該作者
有意思
回復(fù)

使用道具 舉報(bào)

31#
ID:702102 發(fā)表于 2020-3-11 07:45 | 只看該作者
過來學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

32#
ID:695749 發(fā)表于 2020-3-15 19:59 | 只看該作者
先學(xué)習(xí)這個(gè)方法,在實(shí)踐中運(yùn)用,感謝大家的分享!
回復(fù)

使用道具 舉報(bào)

33#
ID:284107 發(fā)表于 2020-3-15 21:19 來自觸屏版 | 只看該作者
兩次對(duì)同一個(gè)數(shù)異或還等于自己
回復(fù)

使用道具 舉報(bào)

34#
ID:234355 發(fā)表于 2020-3-22 13:53 | 只看該作者
int x,y;
x=x+y;
y=x-y;
x=x-y;
回復(fù)

使用道具 舉報(bào)

35#
ID:265584 發(fā)表于 2020-4-12 11:04 | 只看該作者
學(xué)習(xí)學(xué)習(xí),感謝!
回復(fù)

使用道具 舉報(bào)

36#
ID:311846 發(fā)表于 2020-4-21 13:54 | 只看該作者
rotga 發(fā)表于 2019-12-16 08:51
這種交換方法有一個(gè)前提,就是aa和bb不能相等,如果相等,則會(huì)得出錯(cuò)誤的結(jié)果。所以在做異或運(yùn)算前,需要進(jìn) ...

你的基礎(chǔ)不行啊,樓主這么詳細(xì)的說明了你都還沒明白么?
回復(fù)

使用道具 舉報(bào)

37#
ID:311846 發(fā)表于 2020-4-21 13:57 | 只看該作者

這個(gè)的前提是相加不能超出int范圍
回復(fù)

使用道具 舉報(bào)

38#
ID:716413 發(fā)表于 2020-4-22 20:26 | 只看該作者
天才算法!
回復(fù)

使用道具 舉報(bào)

39#
ID:741805 發(fā)表于 2020-4-30 16:52 | 只看該作者
把加法換為減法不就可以了?減法不會(huì)溢出,也比異或效率高
回復(fù)

使用道具 舉報(bào)

40#
ID:741805 發(fā)表于 2020-4-30 16:54 | 只看該作者
a=3;b=5;
a=a-b;
b=a+b;
a=b-a;
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费中文字幕日韩欧美 | 少妇一级淫片免费观看 | 看片地址 | 国产精品久久久久久无人区 | 国产一级片视频 | 成人免费毛片果冻 | 欧美视频在线一区 | 欧美在线| 一区二区三区精品视频 | 蜜桃av一区 | 精品婷婷 | 中文字字幕在线中文 | 日韩精品在线看 | 一级黄色在线观看 | www.爱爱| 国产精品一区二区在线免费观看 | 欧美精品二区三区四区免费看视频 | 国产性色av| 黄色网免费 | 一区二区三区成人 | 精品欧美一区二区三区久久久 | 免费黄网站在线观看 | www.婷婷.com | 国产精品欧美在线 | 在线观看av免费 | 亚洲国产福利 | 91tv国产成人福利 | 户外少妇对白啪啪野战 | 久久久久久综合 | 久久久久久久国产 | 免费成人在线观看视频 | 91久久国产综合久久91精品网站 | 精品免费在线观看 | 国产999久久久 | 91狠狠操| www.黄色av| 日韩中文字幕在线视频 | 欧美一级特黄视频 | 二区三区在线观看 | 不卡视频在线观看 | 成人一区在线观看 |