在C程序中解析32位整数

时间:2011-01-14 15:28:04

标签: c++ c

我有一个32位整数,分成这样的部分:

 --------------------------------------
 | Part1         | Part2    | Part 3  |
 --------------------------------------

第1部分更高16位。 (第2部分+第3部分)=低16位。

第2部分是10位,第3部分是6位

我需要帮助我们如何阅读和更新C程序中的第1部分,第2部分和第3部分。

4 个答案:

答案 0 :(得分:8)

给定具有上述格式的整数x,您可以像这样替换Part2:

x = (x & ~(0x3ff << 6)) | (newPart2 << 6);

和Part3如此:

x = (x & ~0x3f) | newPart3;

这假设newPart2newPart3都是例如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);
}