嵌入式传感器寄存器数据解析

题目描述 :给定一个 32 位整数 packet,按以下规则解析:

  • bit0(最低位) :状态位。1 正常,0 故障。

  • bit1~bit2:寄存器 ID(0~3)。

  • bit3 :数据类型。1 变长,0 固定长度。

  • bit4~bit11:数据修正因子。

  • bit12~bit15:数据有效长度(0~15,仅数据类型为 1 时生效)。

  • bit16~bit30:数据。数据类型为 1 时,按有效长度确定实际有效位;数据类型为 0 时,全部有效。

  • bit31 :奇偶校验位。所有有效数据位与校验位中 1 的个数为偶数则通过。

    复制代码
    #include <stdio.h>
    #include <stdint.h>
    
    int main(void) {
        uint32_t packet;
        if (scanf("%u", &packet) != 1) return 0;
    
        // 1. 状态位
        int status = packet & 1u;
        if (status == 0) {
            printf("-1\n");
            return 0;
        }
    
        // 2. 奇偶校验:统计 bit0~bit31 中 1 的个数,偶数通过
        int ones = 0;
        for (int i = 0; i < 32; i++) {
            if ((packet >> i) & 1u) ones++;
        }
        if (ones % 2 != 0) {
            printf("-2\n");
            return 0;
        }
    
        // 3. 提取字段
        int regId     = (packet >> 1) & 0x3;      // bit1~bit2
        int dataType  = (packet >> 3) & 0x1;      // bit3
        int factor    = (packet >> 4) & 0xFF;     // bit4~bit11
        int validLen  = (packet >> 12) & 0xF;     // bit12~bit15
        uint32_t data = (packet >> 16) & 0x7FFF;  // bit16~bit30
    
        // 4. 变长数据有效长度为 0
        if (dataType == 1 && validLen == 0) {
            printf("-3\n");
            return 0;
        }
    
        // 5. 取实际有效数据
        uint32_t effData;
        if (dataType == 1) {
            effData = data & ((1u << validLen) - 1u);
        } else {
            effData = data;
        }
    
        // 6. 按寄存器 ID 做位运算
        uint32_t result;
        switch (regId) {
            case 0: result = effData & factor; break;          // 与
            case 1: result = effData | factor; break;          // 或
            case 2: result = effData ^ factor; break;          // 异或
            case 3: result = (~(effData ^ factor)) & 0x0FFFFFFFFu; break; // 同或
            default: result = 0; break;
        }
    
        // 7. 与 0x0FFFFFFFF 取与后输出
        result &= 0x0FFFFFFFFu;
        printf("%u\n", result);
    
        return 0;
    }
相关推荐
一去不复返的通信er2 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
Shaoshing3 小时前
LeetCode100 49. 字母异位词分组
java·算法
YFJ_mily3 小时前
第二届区块链技术与基础模型国际学术会议(BTFM2027)
算法·区块链·能源·智能系统·rdlink研发家·机器人自动化
汤姆宝库4 小时前
收官深拆:第一性原理、产业电网与未来推演
大数据·人工智能·算法
moshuying6 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王6 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT7 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying7 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记7 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法