在这个问题中,为简单起见,假设所有整数都是无符号的。
假设我想编写 2 个函数,pack 和 unpack,它们可以将宽度较小的整数打包成一个 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。
我可以通过左移位后右移位轻松编写解包函数。
但我想不出一个明确的方法来编写一个等效的“pack”函数,它会做相反的事情。
假设给定一个整数 0b11,将其打包到位置 5 和宽度 2 的 myint(从上面)中将产生
* *
bit # 8 7 6 5 4 3 2 1
myint 0 1 1 1 0 0 1 1
我想出的最好的办法是用 OR、<< 和 >> 连接很多位串。在我实现和测试它之前,也许有人看到了一个聪明的快速解决方案?
最佳答案
在我的脑海中浮现,未经测试。
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 是当前值时,将值“3”写入偏移量 4(有两位可用)。
关于c - C 中的 "dynamic bitfield",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5149616/