ANSI C的位操作库

时间:2009-08-24 12:17:19

标签: c bit-manipulation

有没有人知道ANSI C的好位操作库? 我基本上需要的是能力,比如在Jovial中设置变量中的特定位,比如

// I assume LSB has index of 0
int a = 0x123;
setBits(&a,2,5, 0xFF);
printf("0x%x"); // should be 0x13F

int a = 0x123;
printf("0x%x",getBits(&a,2,5)); // should be 0x4

char a[] = {0xCC, 0xBB};
char b[] = {0x11, 0x12};
copyBits(a,/*to=*/4,b,/*from=*/,4,/*lengthToCopy=*/8);
// Now a == {0x1C, 0xB2}

有一个名为bitfile的类似库,但它似乎不支持直接内存操作。它只支持向文件流提供位。

这不难写,但如果有测试的东西 - 我不会重新发明轮子。

也许这个库作为更大的库的一部分存在(bzip2gzip是常见的嫌疑人)?

4 个答案:

答案 0 :(得分:7)

我认为图书馆被认为“过于简单”;大多数函数只是一个或两个语句,这会使调用库函数的开销比典型的C程序员容忍的要多一些。 :)

也就是说,始终优秀的glib有两个更复杂的面向比特的函数:g_bit_nth_lsf()g_bit_nth_msf()。这些用于查找第一个位集的索引,分别从最低位或最高位进行搜索。

答案 1 :(得分:3)

使用以下宏将会有很长的路要走:

#define SETBITS(mem, bits)      (mem) |= (bits)
#define CLEARBITS(mem, bits)    (mem) &= ~(bits)
#define BIN(b7,b6,b5,b4, b3,b2,b1,b0)                      \
(unsigned char)(                                           \
    ((b7)<<7) + ((b6)<<6) + ((b5)<<5) + ((b4)<<4) +        \
    ((b3)<<3) + ((b2)<<2) + ((b1)<<1) + ((b0)<<0)          \
)

然后你可以写

int a = 0x123;
SETBITS(a, BIN(0,0,0,1, 1,1,1,0));
printf("0x%x", a); // should be 0x13F

答案 2 :(得分:3)

也许来自“FXT”一书中的algorithms(页面底部的链接)会很有用。

答案 3 :(得分:2)

这似乎是我在我的问题中解决的问题

Algorithm for copying N bits at arbitrary position from one int to another

提供了几种不同的替代方案,最快的是fnieto的组装解决方案。