繁体   English   中英

在C程序中解析32位整数

[英]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;

假设newPart2newPart3均为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM