题目描述 :给定一个 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; }