有没有人知道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的类似库,但它似乎不支持直接内存操作。它只支持向文件流提供位。
这不难写,但如果有测试的东西 - 我不会重新发明轮子。
也许这个库作为更大的库的一部分存在(bzip2
,gzip
是常见的嫌疑人)?
答案 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的组装解决方案。