c - C 中的 "dynamic bitfield"

标签 c bit-manipulation

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

假设我想编写 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/

相关文章:

c - 在 C 中安全地将 char* 双关语

c++ - 可以使用 <、>、= 比较双字段吗?

c - 如何从字符串数组中仅获取所需的元素

c# - 区分整数的位

从字节转换为字

c - 如何在循环中结合使用 scanf (对于非字符或字符串)来获取单个字符

c - 带 C 代码的 4 位 LCD

c - 位掩码 - C 中的按位运算

c - 将 int 存储在 C 的 char 缓冲区中,然后检索相同的

ios - 逻辑和按位运算符警告混淆 - iOS