欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 求助C語言問題 想得到dat的最高位 [打印本頁]

作者: ty86391101    時(shí)間: 2022-1-11 00:19
標(biāo)題: 求助C語言問題 想得到dat的最高位
本帖最后由 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è)啊?
作者: aking991    時(shí)間: 2022-1-11 08:34
P2^0=dat&0x80;這個(gè)語句結(jié)果是P2.0永遠(yuǎn)是0
if((dat&0x80)>0)
P2^0=1;
else if
P2^0=0;
這個(gè)語句就說明當(dāng)條件滿足時(shí)P2.0是1,否則是0
P2^0=dat>>7;這個(gè)語句是P2.0有可能是1也有可能是0
所以上面那三個(gè)語句是不同的,結(jié)果也是不同的

作者: fanwei326    時(shí)間: 2022-1-11 09:02
三個(gè)基本上是一個(gè)意思。但是要判斷dat的最高位并賦值給P2^0, 應(yīng)當(dāng)用第2種。
作者: 3125311919    時(shí)間: 2022-1-11 10:22
不對    P2^0=dat&0x80;   你dat是一個(gè)字節(jié)   計(jì)算出來的是一個(gè)字節(jié)   你把一個(gè)字節(jié)賦值給一個(gè)bit這是不對的
作者: datouyuan    時(shí)間: 2022-1-11 10:57
符號^只有和sbit搭配后才是才是取端口某位的意思,這是51特有的語法。其它時(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ēng)之痕于夢想    時(shí)間: 2022-1-11 11:15
不同的,第二可能會改變
作者: lkc8210    時(shí)間: 2022-1-11 14:51
先不說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é)論是第一種代碼簡潔,效率也最高

推薦第一種

作者: glinfei    時(shí)間: 2022-1-11 16:35
datouyuan 發(fā)表于 2022-1-11 10:57
符號^只有和sbit搭配后才是才是取端口某位的意思,這是51特有的語法。其它時(shí)候都是異或符。
所以你這3個(gè)都 ...

說的對,三個(gè)意思一樣,但第三個(gè)效率最低,我想問的是為啥第二個(gè)效率高,我覺得第一個(gè)和第二個(gè)效率一樣啊?
作者: 188610329    時(shí)間: 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat <<= 1;
P20 = CY;
作者: 溫xyz    時(shí)間: 2022-1-11 20:44
aking991 發(fā)表于 2022-1-11 08:34
P2^0=dat&0x80;這個(gè)語句結(jié)果是P2.0永遠(yuǎn)是0
if((dat&0x80)>0)
P2^0=1;

P2^0=dat&0x80;這個(gè)語句結(jié)果是P2.0永遠(yuǎn)是0。如果dat最高位是1,那么P2^0就是1。實(shí)際上,P2^0就是dat的最高位。后面兩個(gè)也是dat的最高位。
作者: ty86391101    時(shí)間: 2022-1-11 23:38
lkc8210 發(fā)表于 2022-1-11 14:51
先不說P2^0這種明顯的錯(cuò)誤三種代碼都可以得到最高位
把以上三種代碼放進(jìn)Keil 然后編譯
得出以下結(jié)果:

謝謝 大佬
作者: datouyuan    時(shí)間: 2022-1-12 09:43
lkc8210 發(fā)表于 2022-1-11 14:51
先不說P2^0這種明顯的錯(cuò)誤三種代碼都可以得到最高位
把以上三種代碼放進(jìn)Keil 然后編譯
得出以下結(jié)果:

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

另外,就是用keil中,得到dat的最高位和dat的其它位的匯編代碼,方法1、3差別很大,方法2幾乎一致。
作者: lyonkon    時(shí)間: 2022-2-28 22:40
188610329 發(fā)表于 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat

CY = 0;
dat <<= 1;
P20 = CY;
CY應(yīng)該先置0
作者: luoting_jf    時(shí)間: 2022-2-28 23:15
嚴(yán)禁用第二種,位操作
作者: 188610329    時(shí)間: 2022-3-1 17:33
lyonkon 發(fā)表于 2022-2-28 22:40
CY = 0;
dat

不需要,<<= 包含了 clr c,




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1