
题目描述给定一个 32 位整数packet按以下规则解析bit0最低位状态位。1正常0故障。bit1~bit2寄存器 ID0~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; }