C语言位操作与掩码:如何将U4、U6值及布尔值打包存入两个uint8变量
C语言位打包实现方案
位布局定义
根据你给出的示例,先明确三个字段到两个uint8变量的映射规则:
bit_Part1(8位无符号数)- 位[3:0](低4位):存储4位无符号值
U4_part1 - 位[7:4](高4位):存储6位无符号值
U6_part2的低4位(即U6_part2的位[3:0])
- 位[3:0](低4位):存储4位无符号值
bit_Part2(8位无符号数)- 位[1:0](低2位):存储6位无符号值
U6_part2的高2位(即U6_part2的位[5:4]) - 位[2]:存储1位布尔值
Bool_Part3 - 位[7:3]:固定补0
- 位[1:0](低2位):存储6位无符号值
之前代码的问题
你的原有实现主要存在三类问题:
- 没有对输入值做字段宽度掩码,若输入值超过对应位宽会引入脏数据
- 移位位数不符合位布局要求,布尔值和
U6_part2高2位的位置都存在错位 - 存在语法错误:
| =中间不能有空格,正确运算符写法是|=
正确实现代码
#include <stdint.h> void bit_pack(uint8_t U4_part1, uint8_t U6_part2, _Bool Bool_Part3, uint8_t *bit_Part1, uint8_t *bit_Part2) { // 先清零两个输出变量,避免残留脏数据 *bit_Part1 = 0; *bit_Part2 = 0; // 填充bit_Part1 *bit_Part1 |= (U4_part1 & 0x0F); // 低4位存U4_part1,掩码保证仅4位有效 *bit_Part1 |= ((U6_part2 & 0x0F) << 4); // 高4位存U6_part2的低4位 // 填充bit_Part2 *bit_Part2 |= ((U6_part2 >> 4) & 0x03); // 低2位存U6_part2的高2位 *bit_Part2 |= ((Bool_Part3 & 0x01) << 2); // 位2存布尔值,高位自动补0 }
示例验证
用你给出的示例参数验证:
- 输入:
U4_part1=0b0111(十进制7)、U6_part2=0b001111(十进制15)、Bool_Part3=1 - 输出结果:
bit_Part1 = 0b11110111(十六进制0xF7)bit_Part2 = 0b00000100(十六进制0x04)
- 拼接后完整位序列为
00000100 11110111,和你预期的输出完全匹配。
内容的提问来源于stack exchange,提问作者Shubham Khare
相关产品推荐
相关产品推荐

