|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
C語言左移右移請(qǐng)教! |
| 作者:sdllg 欄目:單片機(jī) |
在總線上出現(xiàn)一個(gè)8位的數(shù)A A=A7A6A5A4A3A2A1A0,最先出現(xiàn)的是低位A0,依次是A1,A2------A7。 應(yīng)該怎么才能較快的處理成要求的數(shù)B B=A0A1A2A3A4A5A6A7呢? 想了一天都沒找到比較好的方法,請(qǐng)大家不吝賜教,謝謝! |
| 2樓: | >>參與討論 |
| 作者: xwj 于 2005/3/30 21:50:00 發(fā)布:
最快的方法就是-- 查表 |
|
| 3樓: | >>參與討論 |
| 作者: sdllg 于 2005/3/30 22:08:00 發(fā)布:
詳細(xì)點(diǎn)? C語言怎么查表法?能否說詳細(xì)點(diǎn)?謝謝! |
|
| 4樓: | >>參與討論 |
| 作者: 有風(fēng) 于 2005/3/30 23:58:00 發(fā)布:
試試這樣,用C51的_crol_()及_cror_() #include <intrins.h> void main(void) { unsigned CHAR i,a,b; a = 0x12; b = 0; for(i=0; i<8; i++) { if(_crol_(a,i)&0x80) b = _cror_(b | 1,1); else b = _cror_(b,1); } while(1); } |
|
| 5樓: | >>參與討論 |
| 作者: sdllg 于 2005/3/31 10:33:00 發(fā)布:
很好,謝謝! |
|
| 6樓: | >>參與討論 |
| 作者: xwj 于 2005/3/31 11:26:00 發(fā)布:
字節(jié)顛倒最快的方法就是查表,以空間換時(shí)間,程序如下 #include <intrins.h> unsigned CHAR code tab256[256]={ 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0, 0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0, 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8, 0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8, 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4, 0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4, 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec, 0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc, 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2, 0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2, 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea, 0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa, 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6, 0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6, 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee, 0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe, 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1, 0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1, 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9, 0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9, 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5, 0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5, 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed, 0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd, 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3, 0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3, 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb, 0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb, 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7, 0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7, 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef, 0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff, }; void main(void) { unsigned CHAR a,b; a = 0x12; b= tab256[a]; while(1); } /* 25: a = 0x12; //賦值2周期 C:0x010F 7F12 MOV R7,#0x12 26: b= tab256[a]; //運(yùn)算6周期 C:0x0111 EF MOV A,R7 C:0x0112 900003 MOV DPTR,#tab256(0x0003) C:0x0115 93 MOVC A,@A+DPTR C:0x0116 F508 MOV 0x08,A Program Size: data=10.0 xdata=0 code=282 */ 有風(fēng)的程序?yàn)?br>#include <intrins.h> void main(void) { unsigned CHAR i,a,b; a = 0x12; //賦值2周期 b = 0; for(i=0; i<8; i++) //運(yùn)算314周期,是查表程序的52.3倍,也就是說查表的速度比它快51.3倍! { if(_crol_(a,i)&0x80) b = _cror_(b | 1,1); else b = _cror_(b,1); } while(1); } |
|
| 7樓: | >>參與討論 |
| 作者: cqwangsf 于 2005/3/31 11:29:00 發(fā)布:
查表是最快的?! 查表是最快的?! |
|
| 8樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/31 11:56:00 發(fā)布:
這樣也可以啊 #include <intrins.h> main() { unsigned CHAR a=0x12; unsigned CHAR b=0; unsigned int i; b=_cror_(a,6); while(1); } |
|
| 9樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/31 11:57:00 發(fā)布:
不好意思,發(fā)少了代碼 |
|
| 10樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/31 12:01:00 發(fā)布:
我考慮不周全, 看了XWJ大哥的代碼,學(xué)到不少,謝謝 |
|
| 11樓: | >>參與討論 |
| 作者: huangxd 于 2005/3/31 12:14:00 發(fā)布:
別聽我的 ACC^7=A0 ACC^6=A1 ACC^5=A2 ACC^4=A3 ACC^3=A4 ACC^2=A5 ACC^1=A6 ACC^0=A7 B=ACC,那么B的與A就就是反的 |
|
| 12樓: | >>參與討論 |
| 作者: 有風(fēng) 于 2005/3/31 12:26:00 發(fā)布:
改進(jìn)一下 #include <intrins.h> void main(void) { unsigned CHAR i,a,b; a = 0x12; b = 0; for(i=0; i<=8; i++) b = _cror_( b | _crol_(a,i)&0x01,1); while(1); } |
|
| 13樓: | >>參與討論 |
| 作者: 有風(fēng) 于 2005/3/31 12:37:00 發(fā)布:
同意xwj的說法!甘拜下風(fēng) 同意xwj的說法!一般要求速度嚴(yán)格的場(chǎng)合下,用查表是較好的方法。因?yàn)橐粋(gè)表格已經(jīng)將很多算法包含了。 //剛才發(fā)的帖子有小小錯(cuò)誤,i應(yīng)從1算起,如下: for(i=1; i<=8; i++) b = _cror_( b | _crol_(a,i)&0x01,1); |
|
| 14樓: | >>參與討論 |
| 作者: 風(fēng)間逝 于 2005/3/31 16:08:00 發(fā)布:
不要對(duì)ACC操作為好 ACC是被C51屏蔽的變量 雖然可以在程序里面使用 但是可能在計(jì)算的過程中ACC的值就被改變了 因?yàn)锳CC是使用率最高的寄存器之一 |
|
| 15樓: | >>參與討論 |
| 作者: gbchang 于 2005/3/31 16:16:00 發(fā)布:
X.7=Y.0的方法直觀不慢,查表方法經(jīng)典/通用性強(qiáng). |
|
| 16樓: | >>參與討論 |
| 作者: 石湖天隨 于 2005/3/31 22:31:00 發(fā)布:
查表經(jīng)典、快。! |
|
| 17樓: | >>參與討論 |
| 作者: taoest 于 2005/3/31 23:31:00 發(fā)布:
我的 i=8;b=0; while(i--) { b<<=1; b|=a&0x01; a>>=1; } 完成 * - 本貼最后修改時(shí)間:2005-4-1 10:23:33 修改者:taoest |
|
| 18樓: | >>參與討論 |
| 作者: zizzfish 于 2005/4/1 17:25:00 發(fā)布:
最好的方法還是嵌入?yún)R編。 |
|
| 19樓: | >>參與討論 |
| 作者: xwj 于 2005/4/2 8:07:00 發(fā)布:
別人問的可是“C語言”哦,何況 象Keil等成熟的編譯器C和匯編的效率相差不大的,可以看我在6樓的帖子,里面有編譯后的匯編代碼的 當(dāng)然,合適的C寫法也能優(yōu)化代碼和運(yùn)行速度的,比如 i=8; do {循環(huán)} while(i); 編譯器就會(huì)完美的編譯成 MOV Rn,8 LOOP: .... DJNZ Rn,LOOP 這樣比for(i=0;i<8;i++){}要快得多 |
|
| 20樓: | >>參與討論 |
| 作者: 欣藍(lán) 于 2005/4/3 5:04:00 發(fā)布:
匯編 用匯編速度快,占用空間少,且容易被別人看懂。 |
|
| 21樓: | >>參與討論 |
| 作者: cuittao 于 2005/4/3 8:20:00 發(fā)布:
支持用匯編 支持用匯編 * - 本貼最后修改時(shí)間:2005-4-3 9:15:07 修改者:cuittao |
|
| 22樓: | >>參與討論 |
| 作者: 我不懂 于 2008/3/21 0:16:48 發(fā)布:
用C語言:將一個(gè)正整數(shù)m循環(huán)左移或右移n位,如果n>0,則左移;n<0,則右移;n=0,則不移。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |