[英]Parsing 32 bit integer in C program
我有一个32位整数,分成如下部分:
--------------------------------------
| Part1 | Part2 | Part 3 |
--------------------------------------
第1部分高16位。 (第2部分+第3部分)=低16位。
第2部分是10位,第3部分是6位
我需要有关如何阅读和更新C程序的第1部分,第2部分和第3部分的帮助。
给定具有上述格式的整数x
,您可以像这样替换Part2:
x = (x & ~(0x3ff << 6)) | (newPart2 << 6);
和Part3像这样:
x = (x & ~0x3f) | newPart3;
假设newPart2
和newPart3
均为unsigned int
且其新值已正确调整。
int i
提取各个部分
part1 = (i & 0xFFFF0000) >> 16
part2 = (i & 0x0000FFC0) >> 6
part3 = (i & 0x0000003F)
组成整数
i = (part1 << 16) | (part2 << 6) | (part3)
尝试强制转换为此结构
struct {
uint32_t part_1:16;
uint32_t part_2:10;
uint32_t part_3:6;
} parts;
可能是以下一种,具体取决于字节序
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>
在此后面要使用的理论是和,或与掩码的移位操作。
要访问整数的某些位,请首先创建一个掩码,在其中要使用的位中有一个。 现在在掩码和整数之间应用and and
( &
)操作。 根据&
的行为,掩码为0的位将为0,掩码为1的位将具有整数形式的该位的值。 现在我们只有我们想要的位,我们将它们向右对齐,这是通过将位向右移正确的位置数来完成的,以便将掩码的最右边的位保留在字节的较低有效位置。
要写入字节的一部分,我们需要用拳头使该部分中的内容无效,因为我们使用了用于读取该部分的否定掩码。 取反该部分后,我们将对必须与该位置对齐的新值应用“ or
( |
)操作。
读书:
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);
}
要写(val右对齐):
unsigned int write_part_1(unsigned int composed, unsigned int val) {
return (composed & ~0xffff0000) | ((val & 0x0000ffff) << 16);
}
unsigned int write_part_2(unsigned int composed, unsigned int val) {
return (composed & ~0x0000ffc0) | ((val & 0x000003ff) << 10);
}
unsigned int write_part_3(unsigned int composed, unsigned int val) {
return (composed & ~0x0000003f) | (val & 0x0000003f);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.