C中的“动态位域”

时间:2011-03-01 01:37:21

标签: c bit-manipulation

在这个问题中,假设所有整数都是无符号的。

假设我想编写2个函数,打包和解包,这样可以将较小宽度的整数打包成64位整数。但是,整数的位置和宽度是在运行时给出的,所以我不能使用C位域。

最快的是用一个例子来解释。为简单起见,我将用8位整数来说明:

             * *
bit #    8 7 6 5 4 3 2 1
myint    0 1 1 0 0 0 1 1

假设我想在位置5处“解包”,这是一个宽度为2的整数。这些是用星号标记的两位。该操作的结果应为0b01。同样,如果我在宽度为6的位置2解包,我会得到0b100011。

我可以使用bitshift-left然后右移位来轻松编写解包函数。

但我想不出一个明确的方法来编写一个等效的“包”函数,这将做相反的事情。

假设给定一个整数0b11,将其打包到位置5的myint(从上面),宽度2将产生

             * *
bit #    8 7 6 5 4 3 2 1
myint    0 1 1 1 0 0 1 1

我想出的最好的东西涉及OR的许多结合位串,<<和>>。在我实施和测试之前,也许有人看到了一个聪明的快速解决方案?

1 个答案:

答案 0 :(得分:5)

脱离我的头顶,未经测试。

int pack(int oldPackedInteger, int bitOffset, int bitCount, int value) {
    int mask = (1 << bitCount) -1;
    mask <<= bitOffset;
    oldPackedInteger &= ~mask;
    oldPackedInteger |= value << bitOffset;
    return oldPackedInteger;
}

在你的例子中:

int value = 0x63;
value = pack(value, 4, 2, 0x3);

当0x63是当前值时,以4的偏移(有两位可用)写入值“3”。