我有一个32位整数,分成这样的部分:
--------------------------------------
| Part1 | Part2 | Part 3 |
--------------------------------------
第1部分更高16位。 (第2部分+第3部分)=低16位。
第2部分是10位,第3部分是6位
我需要帮助我们如何阅读和更新C程序中的第1部分,第2部分和第3部分。
答案 0 :(得分:8)
给定具有上述格式的整数x
,您可以像这样替换Part2:
x = (x & ~(0x3ff << 6)) | (newPart2 << 6);
和Part3如此:
x = (x & ~0x3f) | newPart3;
这假设newPart2
和newPart3
都是例如unsigned int
正确调整了新值。
答案 1 :(得分:2)
int i
提取个别部分
part1 = (i & 0xFFFF0000) >> 16
part2 = (i & 0x0000FFC0) >> 6
part3 = (i & 0x0000003F)
编写整数
i = (part1 << 16) | (part2 << 6) | (part3)
答案 2 :(得分:2)
尝试转换为此结构
struct {
uint32_t part_1:16;
uint32_t part_2:10;
uint32_t part_3:6;
} parts;
可能是下面的一个,取决于endianness
struct {
uint32_t part_1:6;
uint32_t part_2:10;
uint32_t part_3:16;
} parts;
显然不便携!
由于你需要读取和更新,指针就可以了。例如,如果您将32位值称为x,则执行以下操作
parts *ptr = (parts *)&x;
ptr->part_2 = <part2 update>
答案 3 :(得分:1)
这背后使用的理论是和/或用掩码进行移位操作。
要访问整数的某些位,首先要创建一个掩码,其中要使用的位中有一些掩码。现在在掩码和整数之间应用and
(&
)运算。根据{{1}}的行为,掩码为0的位将为0,掩码为1的位将具有整数中该位的值。现在我们只有我们想要的位,我们将它们对齐到右边,这就是将位向右移位正确的位置数,以便将掩码的最右位留在字节的较低位置。
要写入一个字节的一部分,我们需要先用拳头来取消该部分中的内容,因为我们使用了用于读取该部分的否定掩码。一旦该部分被否定,我们将&
(or
)操作应用于必须与该位置对齐的新值。
阅读:
|
要写(右对齐的val):
unsigned int read_part_1(unsigned int composed) {
return (composed & 0xffff0000) >> 16;
}
unsigned int read_part_2(unsigned int composed) {
return (composed & 0x0000ffc0) >> 6;
}
unsigned int read_part_3(unsigned int composed) {
return (composed & 0x0000003f);
}