2009-08-24 73 views
5

有谁知道ANSI C的位操作库吗? 我基本上需要,是能力,像Jovial在一个变量设置特定位,像ANSI C位操作库C

// 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是通常的嫌疑犯)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c如果必须的话,将函数中的答案放在函数中。 – dmckee 2009-08-24 14:16:04

+0

@dmckee那里的答案不包括'copyBits'功能。在函数中包装事物通常不是一个“必须”,但它是结构良好的代码必须的。 – 2012-01-08 10:04:38

回答

7

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

也就是说,永远优秀的glib有两个比较复杂的位导向功能:g_bit_nth_lsf()g_bit_nth_msf()。这些用于查找第一个位集的索引,分别从最低位或最高位进行搜索。

+1

我只写了它,它花了15行棘手的代码和更多的单元测试。我花了好几个小时才做到这一点,并且没有为此提供简单的库而看到任何收益。 – 2009-08-24 12:33:31

+2

真的吗? 'stdbool.h'非常简单。 – endolith 2012-03-08 19:41:05

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 
+3

半个解决方案。您还需要一个GETBIT宏。和一个循环。我会在几天后发布我的。 – 2009-08-24 14:54:10