做C语言题2023_10_24

        现有一个嵌入式设备终端传输过来的数据包是一个32位无符号的整型数,这个数据包里面各位含义如下:(位运算)

  • 00-07位:表示温度数据
  • 08-15位:表示湿度数据
  • 16-19位:表示4扇门状态(门的编号0-3)
  • 20-23位:表示四盏灯的状态(灯编号0-3)
  • 24-31位:预留备用

下面是最近一段时间接受的数据包:

请编写一个程序接收这3个数据包,并解析出对应的数据【温度,湿度,门0-3,灯0-3】(门和灯的状态0-关,1-开)。

我自己的思路:

        1.定义掩码

 

  #define Temp_MASK    0xff000000
    #define Humi_MASK    0x00ff0000
    #define Door_1_MASK  0x00008000
    #define Door_2_MASK  0x00004000
    #define Door_3_MASK  0x00002000
    #define Door_4_MASK  0x00001000
    #define Light_1_MASK 0x00000800
    #define Light_2_MASK 0x00000400
    #define Light_3_MASK 0x00000200
    #define Light_4_MASK 0x00000100
    #define Spare_MASK   0x000000ff
#include<stdio.h>
int main()
{
 
    return 0;
}

        2.因为函数中可能多次用要计算温度湿度等所有我定义两个函数来对数据进行处理

    int RESO_32 (unsigned int b,unsigned int c,int i)
    {
         int d = 0;
         d = (b & c)>>i;
        return d;
    }
    void NO_OFF (int a )
    {   
       
        if(a==1)
        printf("OFF\n");
        else if(a==0)
        printf("NO\n");
    }

3.依次进行实现

int main()
{
    unsigned int data = 0;
    scanf("%x",&data);
    //判断温度是多少,并输出
    int TEMP = RESO_32(data,Temp_MASK,24);
    printf("温度:%d\n",TEMP);
    //判断湿度是多少,并输出
    int HUMI =RESO_32(data,Humi_MASK,16);
    printf("湿度:%d\n",HUMI);
    //判断门是否开着
    int DOOR1 =RESO_32(data,Door_1_MASK,15);
    NO_OFF(DOOR1);
      int DOOR2 =RESO_32(data,Door_2_MASK,14);
    NO_OFF(DOOR2);
      int DOOR3 =RESO_32(data,Door_3_MASK,13);
    NO_OFF(DOOR3);
    int DOOR4 =RESO_32(data,Door_4_MASK,12);
    NO_OFF(DOOR4);
    int LIGH1 =RESO_32(data,Light_1_MASK,11);
    NO_OFF(LIGH1);
      int LIGH2 =RESO_32(data,Light_2_MASK,10);
    NO_OFF(LIGH2);
      int LIGH3 =RESO_32(data,Light_3_MASK,9);
    NO_OFF(LIGH3);
      int LIGH4 =RESO_32(data,Light_4_MASK,8);
    NO_OFF(LIGH4);
    return 0;
}

总代码放在这里,希望大家指点

  #include<stdio.h>
    #define Temp_MASK    0xff000000
    #define Humi_MASK    0x00ff0000
    #define Door_1_MASK  0x00008000
    #define Door_2_MASK  0x00004000
    #define Door_3_MASK  0x00002000
    #define Door_4_MASK  0x00001000
    #define Light_1_MASK 0x00000800
    #define Light_2_MASK 0x00000400
    #define Light_3_MASK 0x00000200
    #define Light_4_MASK 0x00000100
    #define Spare_MASK   0x000000ff
    int RESO_32 (unsigned int b,unsigned int c,int i)
    {
         int d = 0;
         d = (b & c)>>i;
        return d;
    }
    void NO_OFF (int a )
    {   
       
        if(a==1)
        printf("OFF\n");
        else if(a==0)
        printf("NO\n");
    }

int main()
{
    unsigned int data = 0;
    scanf("%x",&data);
    //判断温度是多少,并输出
    int TEMP = RESO_32(data,Temp_MASK,24);
    printf("温度:%d\n",TEMP);
    //判断湿度是多少,并输出
    int HUMI =RESO_32(data,Humi_MASK,16);
    printf("湿度:%d\n",HUMI);
    //判断门是否开着
    int DOOR1 =RESO_32(data,Door_1_MASK,15);
    NO_OFF(DOOR1);
      int DOOR2 =RESO_32(data,Door_2_MASK,14);
    NO_OFF(DOOR2);
      int DOOR3 =RESO_32(data,Door_3_MASK,13);
    NO_OFF(DOOR3);
    int DOOR4 =RESO_32(data,Door_4_MASK,12);
    NO_OFF(DOOR4);
    int LIGH1 =RESO_32(data,Light_1_MASK,11);
    NO_OFF(LIGH1);
      int LIGH2 =RESO_32(data,Light_2_MASK,10);
    NO_OFF(LIGH2);
      int LIGH3 =RESO_32(data,Light_3_MASK,9);
    NO_OFF(LIGH3);
      int LIGH4 =RESO_32(data,Light_4_MASK,8);
    NO_OFF(LIGH4);
    return 0;
}

调试时发现scanf输入时我输入的是16进制,却用%d占位符来接收数据,导致没有出现bug,希望大家引以为戒

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值