找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1285|回复: 14
打印 上一主题 下一主题
收起左侧

求助C语言问题 想得到dat的最高位

  [复制链接]
跳转到指定楼层
楼主
ID:1000365 发表于 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;
这三个代码是不是一个意思啊?
就是想得到dat最高位。
什么情况下用哪个啊?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65956 发表于 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
所以上面那三个语句是不同的,结果也是不同的
回复

使用道具 举报

板凳
ID:404893 发表于 2022-1-11 09:02 | 只看该作者
三个基本上是一个意思。但是要判断dat的最高位并赋值给P2^0, 应当用第2种。
回复

使用道具 举报

地板
ID:407019 发表于 2022-1-11 10:22 | 只看该作者
不对    P2^0=dat&0x80;   你dat是一个字节   计算出来的是一个字节   你把一个字节赋值给一个bit这是不对的
回复

使用道具 举报

5#
ID:887371 发表于 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;
复制代码
回复

使用道具 举报

6#
ID:893997 发表于 2022-1-11 11:15 | 只看该作者
不同的,第二可能会改变
回复

使用道具 举报

7#
ID:161164 发表于 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时钟
第三种太多行

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

推荐第一种
回复

使用道具 举报

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

说的对,三个意思一样,但第三个效率最低,我想问的是为啥第二个效率高,我觉得第一个和第二个效率一样啊?
回复

使用道具 举报

9#
ID:624769 发表于 2022-1-11 17:33 | 只看该作者
真正效率最高的得到最高位的做法是:

dat <<= 1;
P20 = CY;
回复

使用道具 举报

10#
ID:8222 发表于 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的最高位。
回复

使用道具 举报

11#
ID:1000365 发表于 2022-1-11 23:38 | 只看该作者
lkc8210 发表于 2022-1-11 14:51
先不说P2^0这种明显的错误三种代码都可以得到最高位
把以上三种代码放进Keil 然后编译
得出以下结果:

谢谢 大佬
回复

使用道具 举报

12#
ID:887371 发表于 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几乎一致。
回复

使用道具 举报

13#
ID:73992 发表于 2022-2-28 22:40 | 只看该作者
188610329 发表于 2022-1-11 17:33
真正效率最高的得到最高位的做法是:

dat

CY = 0;
dat <<= 1;
P20 = CY;
CY应该先置0

评分

参与人数 1黑币 +15 收起 理由
天ノ忆 + 15 赞一个!

查看全部评分

回复

使用道具 举报

14#
ID:1007385 发表于 2022-2-28 23:15 | 只看该作者
严禁用第二种,位操作
回复

使用道具 举报

15#
ID:624769 发表于 2022-3-1 17:33 来自手机 | 只看该作者
lyonkon 发表于 2022-2-28 22:40
CY = 0;
dat

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表