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

QQ登錄

只需一步,快速開始

搜索
查看: 2343|回復(fù): 14
收起左側(cè)

求助C語(yǔ)言問(wèn)題 想得到dat的最高位

  [復(fù)制鏈接]
ID:1000365 發(fā)表于 2022-1-11 00:19 | 顯示全部樓層 |閱讀模式
本帖最后由 ty86391101 于 2022-1-11 05:20 編輯

P2^0=dat&0x80;

if((dat&0x80)>0)
P2^0=1;
else if
P2^0=0;

P2^0=dat>>7;
這三個(gè)代碼是不是一個(gè)意思啊?
就是想得到dat最高位。
什么情況下用哪個(gè)啊?
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2022-1-11 08:34 | 顯示全部樓層
P2^0=dat&0x80;這個(gè)語(yǔ)句結(jié)果是P2.0永遠(yuǎn)是0
if((dat&0x80)>0)
P2^0=1;
else if
P2^0=0;
這個(gè)語(yǔ)句就說(shuō)明當(dāng)條件滿足時(shí)P2.0是1,否則是0
P2^0=dat>>7;這個(gè)語(yǔ)句是P2.0有可能是1也有可能是0
所以上面那三個(gè)語(yǔ)句是不同的,結(jié)果也是不同的
回復(fù)

使用道具 舉報(bào)

ID:404893 發(fā)表于 2022-1-11 09:02 | 顯示全部樓層
三個(gè)基本上是一個(gè)意思。但是要判斷dat的最高位并賦值給P2^0, 應(yīng)當(dāng)用第2種。
回復(fù)

使用道具 舉報(bào)

ID:407019 發(fā)表于 2022-1-11 10:22 | 顯示全部樓層
不對(duì)    P2^0=dat&0x80;   你dat是一個(gè)字節(jié)   計(jì)算出來(lái)的是一個(gè)字節(jié)   你把一個(gè)字節(jié)賦值給一個(gè)bit這是不對(duì)的
回復(fù)

使用道具 舉報(bào)

ID:887371 發(fā)表于 2022-1-11 10:57 | 顯示全部樓層
符號(hào)^只有和sbit搭配后才是才是取端口某位的意思,這是51特有的語(yǔ)法。其它時(shí)候都是異或符。
所以你這3個(gè)都是錯(cuò)的。
應(yīng)該把所有P2^0替換為P20,然后在前面加上一句 sbit P20=P2^0;
三個(gè)基本上是一個(gè)意思。
第3個(gè)效率最低。
第2個(gè)效率最高。但應(yīng)改為
  1. sbit P20=P2^0;
  2. if(dat&0x80)
  3. P20=1;
  4. else
  5. P20=0;
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:893997 發(fā)表于 2022-1-11 11:15 | 顯示全部樓層
不同的,第二可能會(huì)改變
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-11 14:51 | 顯示全部樓層
先不說(shuō)P2^0這種明顯的錯(cuò)誤三種代碼都可以得到最高位
把以上三種代碼放進(jìn)Keil 然后編譯
得出以下結(jié)果:
    13:                         P20 = dat & 0x80;
C:0x008F    E508     MOV      A,dat(0x08)                //<<<<<<<<<<<12時(shí)鐘
C:0x0091    33       RLC      A                                        //<<<<<<<<<<<12時(shí)鐘
C:0x0092    92A0     MOV      P20(0xA0.0),C                //<<<<<<<<<<<24時(shí)鐘


    13:         if(dat & 0x80 > 0) {
    14:             P20 = 1;
    15:         } else {
    16:             P20 = 0;
    17:         }
C:0x008F    E508     MOV      A,dat(0x08)                //<<<<<<<<<<<12時(shí)鐘
C:0x0091    30E004   JNB      0xE0.0,C:0098                //<<<<<<<<<<<24時(shí)鐘
C:0x0094    D2A0     SETB     P20(0xA0.0)                //<<<<<<<<<<<12時(shí)鐘
C:0x0096    8002     SJMP     C:009A                        //<<<<<<<<<<<12時(shí)鐘
C:0x0098    C2A0     CLR      P20(0xA0.0)                //<<<<<<<<<<<24時(shí)鐘
C:0x009A    E508     

    13:                         P20 = dat >> 7;
C:0x008F    E508     MOV      A,dat(0x08)
C:0x0091    C4       SWAP     A
C:0x0092    13       RRC      A
C:0x0093    13       RRC      A
C:0x0094    13       RRC      A
C:0x0095    5401     ANL      A,#0x01
C:0x0097    24FF     ADD      A,#0xFF
C:0x0099    92A0     MOV      P20(0xA0.0),C




看的出第一種要走48時(shí)鐘
第二種如果高位是零走36+24時(shí)鐘,高位是一走36+12+12時(shí)鐘
第三種太多行

結(jié)論是第一種代碼簡(jiǎn)潔,效率也最高

推薦第一種
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2022-1-11 16:35 | 顯示全部樓層
datouyuan 發(fā)表于 2022-1-11 10:57
符號(hào)^只有和sbit搭配后才是才是取端口某位的意思,這是51特有的語(yǔ)法。其它時(shí)候都是異或符。
所以你這3個(gè)都 ...

說(shuō)的對(duì),三個(gè)意思一樣,但第三個(gè)效率最低,我想問(wèn)的是為啥第二個(gè)效率高,我覺(jué)得第一個(gè)和第二個(gè)效率一樣?
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-1-11 17:33 | 顯示全部樓層
真正效率最高的得到最高位的做法是:

dat <<= 1;
P20 = CY;
回復(fù)

使用道具 舉報(bào)

ID:8222 發(fā)表于 2022-1-11 20:44 | 顯示全部樓層
aking991 發(fā)表于 2022-1-11 08:34
P2^0=dat&0x80;這個(gè)語(yǔ)句結(jié)果是P2.0永遠(yuǎn)是0
if((dat&0x80)>0)
P2^0=1;

P2^0=dat&0x80;這個(gè)語(yǔ)句結(jié)果是P2.0永遠(yuǎn)是0。如果dat最高位是1,那么P2^0就是1。實(shí)際上,P2^0就是dat的最高位。后面兩個(gè)也是dat的最高位。
回復(fù)

使用道具 舉報(bào)

ID:1000365 發(fā)表于 2022-1-11 23:38 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-11 14:51
先不說(shuō)P2^0這種明顯的錯(cuò)誤三種代碼都可以得到最高位
把以上三種代碼放進(jìn)Keil 然后編譯
得出以下結(jié)果:

謝謝 大佬
回復(fù)

使用道具 舉報(bào)

ID:887371 發(fā)表于 2022-1-12 09:43 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-11 14:51
先不說(shuō)P2^0這種明顯的錯(cuò)誤三種代碼都可以得到最高位
把以上三種代碼放進(jìn)Keil 然后編譯
得出以下結(jié)果:

得到dat的最高位,對(duì)keil這種高度優(yōu)化的編譯器來(lái)說(shuō),確實(shí)是1最高。我用過(guò)一些國(guó)產(chǎn)臺(tái)產(chǎn)的芯片的C編譯器,它們編譯優(yōu)化做得不夠,方法2效率最高,方法1、3的執(zhí)行步數(shù)是2的5倍以上。

另外,就是用keil中,得到dat的最高位和dat的其它位的匯編代碼,方法1、3差別很大,方法2幾乎一致。
回復(fù)

使用道具 舉報(bào)

ID:73992 發(fā)表于 2022-2-28 22:40 | 顯示全部樓層
188610329 發(fā)表于 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat

CY = 0;
dat <<= 1;
P20 = CY;
CY應(yīng)該先置0

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
天ノ憶 + 15 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1007385 發(fā)表于 2022-2-28 23:15 | 顯示全部樓層
嚴(yán)禁用第二種,位操作
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-3-1 17:33 來(lái)自觸屏版 | 顯示全部樓層
lyonkon 發(fā)表于 2022-2-28 22:40
CY = 0;
dat

不需要,<<= 包含了 clr c,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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