解题思路
算法类型:位运算 / 位域解析(bit manipulation)
题目把一个 32 位 int 拆成固定长度的几个位域(状态、寄存器ID、数据类型、修正因子、有效长度、数据、奇偶校验位),要求先做若干“合法性/校验”检查,最后按寄存器ID做一种位运算并输出 32 位有符号结果。整体是一次位域解码 + 常量次位运算的模拟题,关键点都在“边界条件顺序”和“负数/符号位语义”上。
核心处理分四步:
- 统一到无符号视角:
packet 是 32 位补码 int,可能为负。若直接按有符号数右移,符号位会扩展污染高位,因此先令 u = packet & 0xFFFFFFFF(C/C++ 用 (unsigned int)、Java 用 long + & 0xFFFFFFFFL、JS 用 >>> 0、Python 用 & 0xFFFFFFFF),之后再逐段 & 掩码提取位域,任何语言都能得到同一套字段。
题目内容
系统从传感器的某个寄存器读取一个 32 位的 int 型整数 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 的个数为偶数,表示数据校验通过;否则为不通过。
解析流程:
- 检查状态,如果传感器故障(状态为 0),返回 −1。
- 检查数据奇偶校验是否通过,不通过则返回 −2。
- 数据类型为 1 时,数据有效长度如果为 0,则返回 −3。
- 寄存器ID为 0 时:返回有效数据与数据修正因子按位与的结果。
- 寄存器ID为 1 时:返回有效数据与数据修正因子按位或的结果。
- 寄存器ID为 2 时:返回有效数据与数据修正因子按位异或的结果。
- 寄存器ID为 3 时:返回有效数据与数据修正因子按位同或的结果。
注:解析流程中 4、5、6、7 步骤的结果返回前需要和 0x0FFFFFFFF 取与。
输入描述
输入为一个 32 位整型数值 packet。
输出描述
按十进制格式输出解析结果。
样例1
输入
343873
输出
4
说明
正常解析(寄存器ID=0,& 运算)。
输入:packet=0x00053F41(十进制 343873)。
二进制:0000 0000 0000 0101 0011 1111 0100 0001。
分析:
- bit0:1
- bit1∼bit2:00
- bit3:0
- bit4∼bit11:1111 0100
- bit12∼bit15:0011
- bit16∼bit30:000 0000 0000 0101
- bit31:0
解析流程:
- 状态检查:状态为 1,正常。
- 数据提取:数据类型为 0,实际数据为 0x0005。
- 奇偶校验:数据 0x0005(二进制 101)有 2 个 1。校验位为 0。总数 2+0=2(偶数),校验通过。
- 运算:寄存器ID为 0,执行与:0x05 & 0xF4。
- 0000 0101(5)
- 1111 0100(244)
- 结果:0000 0100 & 0x0FFFFFFFF=4(十进制)
输出:4。
样例2
输入
0
输出
-1
说明
输入:packet=0x00000000(十进制 0)。
二进制:0000 0000 0000 0000 0000 0000 0000 0000。
分析:
- bit0:0(表示异常)
返回:−1。