C中的"动态位域"

Max*_*Max 1 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
Run Code Online (Sandbox Code Playgroud)

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

我可以使用bithift-left和bithift right轻松编写解包函数.

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

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

             * *
bit #    8 7 6 5 4 3 2 1
myint    0 1 1 1 0 0 1 1
Run Code Online (Sandbox Code Playgroud)

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

Ebo*_*ike 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;
}
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

int value = 0x63;
value = pack(value, 4, 2, 0x3);
Run Code Online (Sandbox Code Playgroud)

当0x63是当前值时,在偏移量4(有两位可用)时写入值"3".