【发布时间】:2011-03-01 01:37:20
【问题描述】:
在这个问题中,为简单起见,假设所有整数都是无符号的。
假设我想编写 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、> 连接很多位串。在我实施和测试它之前,也许有人看到了一个聪明的快速解决方案?
【问题讨论】:
标签: c bit-manipulation