标题: 求助C语言问题 想得到dat的最高位 [打印本页]

作者: ty86391101    时间: 2022-1-11 00:19
标题: 求助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;
这三个代码是不是一个意思啊?
就是想得到dat最高位。
什么情况下用哪个啊?
作者: aking991    时间: 2022-1-11 08:34
P2^0=dat&0x80;这个语句结果是P2.0永远是0
if((dat&0x80)>0)
P2^0=1;
else if
P2^0=0;
这个语句就说明当条件满足时P2.0是1,否则是0
P2^0=dat>>7;这个语句是P2.0有可能是1也有可能是0
所以上面那三个语句是不同的,结果也是不同的

作者: fanwei326    时间: 2022-1-11 09:02
三个基本上是一个意思。但是要判断dat的最高位并赋值给P2^0, 应当用第2种。
作者: 3125311919    时间: 2022-1-11 10:22
不对    P2^0=dat&0x80;   你dat是一个字节   计算出来的是一个字节   你把一个字节赋值给一个bit这是不对的
作者: datouyuan    时间: 2022-1-11 10:57
符号^只有和sbit搭配后才是才是取端口某位的意思,这是51特有的语法。其它时候都是异或符。
所以你这3个都是错的。
应该把所有P2^0替换为P20,然后在前面加上一句 sbit P20=P2^0;
三个基本上是一个意思。
第3个效率最低。
第2个效率最高。但应改为
  1. sbit P20=P2^0;
  2. if(dat&0x80)
  3. P20=1;
  4. else
  5. P20=0;
复制代码

作者: 风之痕于梦想    时间: 2022-1-11 11:15
不同的,第二可能会改变
作者: lkc8210    时间: 2022-1-11 14:51
先不说P2^0这种明显的错误三种代码都可以得到最高位
把以上三种代码放进Keil 然后编译
得出以下结果:
    13:                         P20 = dat & 0x80;
C:0x008F    E508     MOV      A,dat(0x08)                //<<<<<<<<<<<12时钟
C:0x0091    33       RLC      A                                        //<<<<<<<<<<<12时钟
C:0x0092    92A0     MOV      P20(0xA0.0),C                //<<<<<<<<<<<24时钟


    13:         if(dat & 0x80 > 0) {
    14:             P20 = 1;
    15:         } else {
    16:             P20 = 0;
    17:         }
C:0x008F    E508     MOV      A,dat(0x08)                //<<<<<<<<<<<12时钟
C:0x0091    30E004   JNB      0xE0.0,C:0098                //<<<<<<<<<<<24时钟
C:0x0094    D2A0     SETB     P20(0xA0.0)                //<<<<<<<<<<<12时钟
C:0x0096    8002     SJMP     C:009A                        //<<<<<<<<<<<12时钟
C:0x0098    C2A0     CLR      P20(0xA0.0)                //<<<<<<<<<<<24时钟
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时钟
第二种如果高位是零走36+24时钟,高位是一走36+12+12时钟
第三种太多行

结论是第一种代码简洁,效率也最高

推荐第一种

作者: glinfei    时间: 2022-1-11 16:35
datouyuan 发表于 2022-1-11 10:57
符号^只有和sbit搭配后才是才是取端口某位的意思,这是51特有的语法。其它时候都是异或符。
所以你这3个都 ...

说的对,三个意思一样,但第三个效率最低,我想问的是为啥第二个效率高,我觉得第一个和第二个效率一样啊?
作者: 188610329    时间: 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat <<= 1;
P20 = CY;
作者: 温xyz    时间: 2022-1-11 20:44
aking991 发表于 2022-1-11 08:34
P2^0=dat&0x80;这个语句结果是P2.0永远是0
if((dat&0x80)>0)
P2^0=1;

P2^0=dat&0x80;这个语句结果是P2.0永远是0。如果dat最高位是1,那么P2^0就是1。实际上,P2^0就是dat的最高位。后面两个也是dat的最高位。
作者: ty86391101    时间: 2022-1-11 23:38
lkc8210 发表于 2022-1-11 14:51
先不说P2^0这种明显的错误三种代码都可以得到最高位
把以上三种代码放进Keil 然后编译
得出以下结果:

谢谢 大佬
作者: datouyuan    时间: 2022-1-12 09:43
lkc8210 发表于 2022-1-11 14:51
先不说P2^0这种明显的错误三种代码都可以得到最高位
把以上三种代码放进Keil 然后编译
得出以下结果:

得到dat的最高位,对keil这种高度优化的编译器来说,确实是1最高。我用过一些国产台产的芯片的C编译器,它们编译优化做得不够,方法2效率最高,方法1、3的执行步数是2的5倍以上。

另外,就是用keil中,得到dat的最高位和dat的其它位的汇编代码,方法1、3差别很大,方法2几乎一致。
作者: lyonkon    时间: 2022-2-28 22:40
188610329 发表于 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat

CY = 0;
dat <<= 1;
P20 = CY;
CY应该先置0
作者: luoting_jf    时间: 2022-2-28 23:15
严禁用第二种,位操作
作者: 188610329    时间: 2022-3-1 17:33
lyonkon 发表于 2022-2-28 22:40
CY = 0;
dat

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1