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

题目描述 :给定一个 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;
    }
相关推荐
Tingmanyi1 小时前
YOLOv13改进策略【卷积层篇】| RFAConv 感受野注意力卷积,每个位置都值得被单独加权
深度学习·算法·yolo·目标检测·计算机视觉
yi0112 小时前
Leetcode 49 用 “身份证‘‘巧解
人工智能·笔记·python·算法·leetcode·哈希表
liuchangng2 小时前
类Jev项目Kev从入门到实战(7):如何选型:决策树与 checklist
算法·决策树·机器学习
yi0112 小时前
DAY22: LeetCode 733:图像渲染——从二维网格开始理解 DFS 和 BFS
数据结构·笔记·python·算法·leetcode·深度优先·宽度优先
Pniubi2 小时前
力扣41缺失的第一个正数(哈希表法)
算法·leetcode·职场和发展
地平线开发者2 小时前
MQBench QAT量化实践指南
人工智能·算法·自动驾驶
今夜有雨.2 小时前
图像运算、掩膜/ROI 与绘制交互
c语言·数据结构·c++·qt·算法·计算机视觉
UIU1142 小时前
P1028 [NOIP 2001 普及组] 数的计算
c++·算法
Keven_113 小时前
BUG:UVA116
算法·bug·图论