[英]Bit manipulation library for ANSI C
有谁知道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
是通常的嫌疑人)?
我认为图书馆被认为“过于简单”; 大多数函数只是一个或两个语句,这会使调用库函数的开销比典型的C程序员容忍的要多一些。 :)
也就是说,始终出色的glib有两个更复杂的面向位的函数: g_bit_nth_lsf()
和g_bit_nth_msf()
。 这些用于查找第一个位集的索引,分别从最低位或最高位进行搜索。
使用以下宏可以实现很长的目标:
#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
也许算法从“FXT”一书(在页面的底部链接)将是有益的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.