ANSI C的位操作库

eyh26e7m  于 2023-06-21  发布在  其他
关注(0)|答案(5)|浏览(117)

有谁知道一个好的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是通常的嫌疑人)?

zlhcx6iw

zlhcx6iw1#

我认为对于一个图书馆来说是“太简单了”;大多数函数只有一两条语句,这使得调用库函数的开销比典型的C程序员所能承受的要多一点。:)
也就是说,始终出色的glib具有两个更复杂的面向位的函数:g_bit_nth_lsf()g_bit_nth_msf()。这些用于找到第一位集合的索引,分别从最低位或最高位进行搜索。

yrefmtwq

yrefmtwq2#

这似乎是我在质询中要处理的问题
Algorithm for copying N bits at arbitrary position from one int to another
有几种不同的替代方案,最快的是fnieto的组装解决方案。

rta7y2nd

rta7y2nd3#

使用以下宏,您将取得长足进步:

#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
xv8emn3q

xv8emn3q4#

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

oxcyiej7

oxcyiej75#

我可能有点晚了,但我为C编写了this简单位操作库,你可能会感兴趣。

相关问题