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

QQ登錄

只需一步,快速開始

搜索
樓主: f556
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
41#
ID:753146 發(fā)表于 2020-5-16 10:48 | 只看該作者
樓主有點(diǎn)武斷了,用加法交換雖然會(huì)溢出但結(jié)果依然正確。在指出問(wèn)題之前最少要?jiǎng)邮衷囈辉嚒?/td>
回復(fù)

使用道具 舉報(bào)

42#
ID:753146 發(fā)表于 2020-5-16 10:50 | 只看該作者
溢出不影響結(jié)果,樓主方向錯(cuò)了。
回復(fù)

使用道具 舉報(bào)

43#
ID:47286 發(fā)表于 2020-5-20 17:09 | 只看該作者
請(qǐng)教兩個(gè)問(wèn)題 如下應(yīng)該是最傻愣的方法吧 第一這樣也不限制長(zhǎng)度 不管是char還是int 因?yàn)檫^(guò)程變量的長(zhǎng)度是相同的 第二不需要運(yùn)算 只是賦值 會(huì)比你的方法速度快 是么

uchar a=123;
uchar b=234;

void swap()
{
uchar c;
c=a;
a=b;
b=c;
}
回復(fù)

使用道具 舉報(bào)

44#
ID:467862 發(fā)表于 2020-5-25 15:53 | 只看該作者
好厲害,電賽初學(xué)者剛好
回復(fù)

使用道具 舉報(bào)

45#
ID:762498 發(fā)表于 2020-5-27 14:58 | 只看該作者
好東西值得去想和學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

46#
ID:764107 發(fā)表于 2020-5-30 17:26 | 只看該作者
樓主的這個(gè)帖子很有意義,用到了異或的性質(zhì):
只要有: a^b=c
那么對(duì)于()^()=()可以隨便填入a、b、c 都成立,交換數(shù)來(lái)説也就很簡(jiǎn)單了
MOV A,#33H
MOV 30H,#66H
XRL A,30H
XRL 30H,A
XRL A,30H
在一些寄存器不夠的地方用剛剛好,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

47#
ID:807712 發(fā)表于 2020-8-29 16:16 | 只看該作者
有那么點(diǎn)意思,值得發(fā)揚(yáng)光大!
回復(fù)

使用道具 舉報(bào)

48#
ID:483991 發(fā)表于 2020-8-29 16:31 | 只看該作者
頂起!值得推廣!
回復(fù)

使用道具 舉報(bào)

49#
ID:337139 發(fā)表于 2020-9-23 16:47 | 只看該作者
你這種方法可行,只是單片機(jī)就需要花更多是時(shí)間去處理,效率有點(diǎn)低。
回復(fù)

使用道具 舉報(bào)

50#
ID:838081 發(fā)表于 2020-11-6 14:28 | 只看該作者
你的思路不錯(cuò)
回復(fù)

使用道具 舉報(bào)

51#
ID:8222 發(fā)表于 2020-11-28 07:54 | 只看該作者

x=x+y可能會(huì)溢出。
回復(fù)

使用道具 舉報(bào)

52#
ID:879809 發(fā)表于 2021-1-23 18:06 | 只看該作者
溫xyz 發(fā)表于 2020-11-28 07:54
x=x+y可能會(huì)溢出。

溢出不影響結(jié)果的正確性。
回復(fù)

使用道具 舉報(bào)

53#
ID:878235 發(fā)表于 2021-1-28 13:56 | 只看該作者

所謂的相等,是認(rèn)為分析,
在程序運(yùn)行時(shí) A  B  有時(shí)相等,有時(shí)不相等
例如  A 是用戶指定的數(shù)據(jù)
        B  是函數(shù)得出的返回值

那么:我們控制不了的兩個(gè)數(shù)據(jù),他們有可能相等(作者認(rèn)為相等的會(huì)出錯(cuò)),有時(shí)候不相等
回復(fù)

使用道具 舉報(bào)

54#
ID:886836 發(fā)表于 2021-3-24 17:23 | 只看該作者
不同的思維方式,看了很受益
回復(fù)

使用道具 舉報(bào)

55#
ID:855987 發(fā)表于 2021-3-27 15:56 | 只看該作者
好方法呀!
回復(fù)

使用道具 舉報(bào)

56#
ID:693254 發(fā)表于 2021-5-12 14:53 | 只看該作者
方法不錯(cuò)~~不過(guò)大型的程序會(huì)在意這個(gè)小算法嗎?
回復(fù)

使用道具 舉報(bào)

57#
ID:511754 發(fā)表于 2021-5-25 09:28 | 只看該作者
討論熱烈拓展思路
回復(fù)

使用道具 舉報(bào)

58#
ID:123289 發(fā)表于 2021-6-23 15:42 | 只看該作者
1、程序運(yùn)行時(shí)間長(zhǎng);
2、占用存儲(chǔ)器多;
3、不實(shí)用。
將這段程序編譯后,看看所用的代碼就知道有多蠢了。
比起:A--->C,B---->A,C----->B 的方案差遠(yuǎn)了。
回復(fù)

使用道具 舉報(bào)

59#
ID:519089 發(fā)表于 2021-7-14 19:16 | 只看該作者
時(shí)間換空間
回復(fù)

使用道具 舉報(bào)

60#
ID:519089 發(fā)表于 2021-7-14 19:17 | 只看該作者
PUSH A
MOV A,B
POP B
最簡(jiǎn)單
回復(fù)

使用道具 舉報(bào)

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

1.相等了 就可以不用交換了;
2.可以加個(gè)判斷,只有不相等的時(shí)候才會(huì)有下面的交換
回復(fù)

使用道具 舉報(bào)

62#
ID:130230 發(fā)表于 2021-8-2 17:05 | 只看該作者
rotga 發(fā)表于 2019-12-31 10:08
不是明顯錯(cuò)了,而是模擬在復(fù)雜環(huán)境里面,很有可能產(chǎn)生待比較的兩個(gè)數(shù)的指針指向同一地址,而結(jié)果你也看到了 ...

你用其它方法指向同一個(gè)地址也是會(huì)有問(wèn)題的,這個(gè)和樓主的算法無(wú)關(guān)。
回復(fù)

使用道具 舉報(bào)

63#
ID:584195 發(fā)表于 2021-8-3 22:26 | 只看該作者
這是什么原理?可以解釋一下嗎?
回復(fù)

使用道具 舉報(bào)

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

你是最牛的人,給你點(diǎn)贊先!
回復(fù)

使用道具 舉報(bào)

65#
ID:958719 發(fā)表于 2021-8-3 22:48 | 只看該作者
初學(xué)者的天堂
回復(fù)

使用道具 舉報(bào)

66#
ID:88256 發(fā)表于 2021-8-4 00:57 | 只看該作者

我也想這樣說(shuō)的,這個(gè)占用的是預(yù)留的空間,過(guò)后歸還,不會(huì)額外占用空間
回復(fù)

使用道具 舉報(bào)

67#
ID:513213 發(fā)表于 2021-8-7 23:56 | 只看該作者
rotga 發(fā)表于 2019-12-22 22:54
#include
void swap(int *a,int *b)
{

這句錯(cuò)了swap(&test[0],&test[0]);
應(yīng)為  swap(&test[0],&test[1]);
回復(fù)

使用道具 舉報(bào)

68#
ID:624769 發(fā)表于 2021-9-24 23:20 | 只看該作者
specialClass 發(fā)表于 2020-5-30 17:26
樓主的這個(gè)帖子很有意義,用到了異或的性質(zhì):
只要有: a^b=c
那么對(duì)于()^()=()可以隨便填入a、b、 ...

兄弟,你都用匯編寫了……
你直接一個(gè)  XCH A,30H 不就換過(guò)來(lái)了么? 還那么幾個(gè) XRL 干嘛?
回復(fù)

使用道具 舉報(bào)

69#
ID:624769 發(fā)表于 2021-9-24 23:27 | 只看該作者
表面上看,不占用中間變量,實(shí)際上至少占用了累加器A,根據(jù)不同的編譯方式還可能占用寄存器B,一樣動(dòng)用了累加器A,你先移動(dòng)到累加器A,再互相移位遠(yuǎn)比反復(fù)運(yùn)算要好得多。
回復(fù)

使用道具 舉報(bào)

70#
ID:468878 發(fā)表于 2021-11-3 11:37 | 只看該作者

你這種算法很好。運(yùn)行效率與可讀性應(yīng)該是比較強(qiáng)的。
不過(guò)我覺(jué)得還是設(shè)個(gè)中間數(shù)的最簡(jiǎn)單明了,不用去規(guī)避一些未知的坑。
回復(fù)

使用道具 舉報(bào)

71#
ID:22218 發(fā)表于 2022-3-19 05:10 | 只看該作者
異或效率該比加減高吧?這個(gè)出來(lái)40年了吧?我好奇還有折磨多人發(fā)帖
回復(fù)

使用道具 舉報(bào)

72#
ID:115923 發(fā)表于 2022-3-19 09:28 | 只看該作者
#include <stdio.h>

int main(void)
{
   unsigned int a=65530;
   unsigned int b=65535;
   
printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
   
a=a+b;   //a=a*b;
   
b=a-b;   //b=a/b;
   
a=a-b;   //a=a/b;
   
printf("交換前a,b的值分別為:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
       
        return 0;
}


已經(jīng)測(cè)試了, 沒(méi)有問(wèn)題, 不會(huì)溢出問(wèn)題
回復(fù)

使用道具 舉報(bào)

73#
ID:1017814 發(fā)表于 2022-4-16 14:43 | 只看該作者
就用一下一個(gè)中間變量又能咋滴?

 想起了一個(gè)笑話,3個(gè)專家和一個(gè)農(nóng)民在說(shuō)下雨時(shí)雨滴的問(wèn)題,這個(gè)故事 就不在這里說(shuō)了。

原來(lái)這個(gè)笑話是說(shuō)我們程序猿的。。。。。。。
回復(fù)

使用道具 舉報(bào)

74#
ID:397054 發(fā)表于 2022-6-11 20:02 | 只看該作者
zyluglugl 發(fā)表于 2021-8-3 22:26
這是什么原理?可以解釋一下嗎?

有兩條:
1是,異或運(yùn)算既滿足交換律也滿足結(jié)合律;
2是,與自己異或結(jié)果是0且0與一個(gè)值異或結(jié)果就是那個(gè)值。
回復(fù)

使用道具 舉報(bào)

75#
ID:397054 發(fā)表于 2022-6-11 20:17 | 只看該作者
dzbj 發(fā)表于 2020-5-20 17:09
請(qǐng)教兩個(gè)問(wèn)題 如下應(yīng)該是最傻愣的方法吧 第一這樣也不限制長(zhǎng)度 不管是char還是int 因?yàn)檫^(guò)程變量的長(zhǎng)度是相 ...

異或運(yùn)算是CPU最拿手的運(yùn)算之一,與賦值也不相上下,都可以是單周期單字節(jié)指令,速度上差不了多少只是程序的可讀性差點(diǎn)。賦值的方法要開辟第三個(gè)變量并也是要對(duì)其操作的,時(shí)間上不見(jiàn)得有多少優(yōu)越性。
回復(fù)

使用道具 舉報(bào)

76#
ID:397054 發(fā)表于 2022-6-11 20:40 | 只看該作者
guyunfeng 發(fā)表于 2020-5-16 10:50
溢出不影響結(jié)果,樓主方向錯(cuò)了。

溢出的確不影響結(jié)果,但樓主的方向哪里錯(cuò)了?他這個(gè)方法的結(jié)果不對(duì)嗎?這兩種方法都有可讀性問(wèn)題,但相比之下很顯然樓主的更專業(yè),可讀性、嚴(yán)格性要好得多,常用C語(yǔ)言尤其是匯編語(yǔ)言的都對(duì)溢出、反碼補(bǔ)碼很在乎,這是習(xí)慣。我還是第一次看到這么做,看到加減法時(shí)也立即想到了有溢出問(wèn)題,假如是別人寫的程序要我來(lái)檢查的話,我肯定要多花時(shí)間精力甚至詢問(wèn)編程者來(lái)肯定它的正確性,而樓主的方法嚴(yán)格明了,不必跟任何人商量,可讀性、專業(yè)性樓主的要好得多,何來(lái)“方向錯(cuò)誤”?
回復(fù)

使用道具 舉報(bào)

77#
ID:397054 發(fā)表于 2022-6-11 20:49 | 只看該作者

你這是匯編語(yǔ)言,你這么做恰恰是舍近求遠(yuǎn),微處理器、單片機(jī)都有交換指令,一條指令即可,早年的Z80是XCHG,86處理器也是,51的匯編寫法好像是XCH,當(dāng)目標(biāo)和原都是寄存器時(shí),交換指令是典型的單周期單字節(jié)指令。
回復(fù)

使用道具 舉報(bào)

78#
ID:397054 發(fā)表于 2022-6-11 21:05 | 只看該作者
1823711995 發(fā)表于 2020-4-30 16:52
把加法換為減法不就可以了?減法不會(huì)溢出,也比異或效率高

換為減法也可以,但也有問(wèn)題,小減大會(huì)得到補(bǔ)碼,這個(gè)你想過(guò)沒(méi)有?但是,也不影響結(jié)果,也行得通,可讀性那就比加法還差。。。!皽p法比異或效率高”——這個(gè)是錯(cuò)的,【異或】運(yùn)算是CPU最拿手的指令,無(wú)出其右,你大概不太熟悉數(shù)字電路,加法電路就是異或電路,如果是單純的異或那就連進(jìn)位都不需要,完整的加法電路就是帶進(jìn)位的異或電路。
回復(fù)

使用道具 舉報(bào)

79#
ID:397054 發(fā)表于 2022-6-11 21:19 | 只看該作者
這個(gè)方法不會(huì)比更流行的賦值方法慢,異或運(yùn)算是CPU上處理起來(lái)最快的指令,不會(huì)比賦值慢,更不會(huì)比加減法慢,它們都可以是單字節(jié)單周期指令,樓主的方法比加減法要好得多,相比之下嚴(yán)格、明了得多,老手都會(huì)用樓主的方法而不會(huì)去用加減法的雖然它也正確,加減法明顯的很笨拙、不專業(yè)。
回復(fù)

使用道具 舉報(bào)

80#
ID:397054 發(fā)表于 2022-6-11 21:56 | 只看該作者
yzwzfyz 發(fā)表于 2021-6-23 15:42
1、程序運(yùn)行時(shí)間長(zhǎng);
2、占用存儲(chǔ)器多;
3、不實(shí)用。

不會(huì)的,如果是匯編語(yǔ)言,這個(gè)算法只快不會(huì)慢,它少用了一個(gè)變量怎么會(huì)“占用存儲(chǔ)器多”呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表