在这个问题中,假设所有整数都是无符号的。
假设我想编写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的许多结合位串,<<和>>。在我实施和测试之前,也许有人看到了一个聪明的快速解决方案?
答案 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”。