2009-08-24 81 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