2009-08-24 18 views
5

誰もANSI C用のビット操作ライブラリをよく知っていますか?ANSI 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と呼ばれる同様のライブラリがありますように、変数に何かを特定のビットを設定し、直接のメモリ操作をサポートしていないようJovialのように、私は基本的に必要なもの は、能力があります。ファイルストリームにビットを供給することのみサポートしています。

書くのは難しいことではありませんが、テストされているものがあれば、私はホイールを再発明しません。

多分、このライブラリは大きなライブラリの一部として存在します(bzip2gzipは通常の容疑者です)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c必要に応じて、関数内で回答を囲みます。 – dmckee

+0

@dmckeeそこの答えは 'copyBits'機能を含んでいません。また、関数をラップすることは、一般的には「必須」ではありませんが、構造化されたコードでは必須です。 –

答えて

7

私は、ライブラリにとってはあまりにも単純すぎると考えています。ほとんどの関数は1つまたは2つの文でしかないので、典型的なCプログラマーが許容する以上にライブラリ関数を呼び出すオーバーヘッドがかかります。

つまり、常に優れたglibは、より複雑なビット指向の機能のうちの2つ、すなわちg_bit_nth_lsf()g_bit_nth_msf()を持っています。これらは、最下位ビットまたは最上位ビットからそれぞれ検索して、最初のビットセットのインデックスを見つけるために使用されます。

+1

私はちょうどそれを書いた、それはトリッキーなコードとはるかに多くの単体テストの15行がかかった。それには数時間かかりましたが、単純なライブラリを提供していないため、何の利益も見られません。 –

+2

本当ですか? 'stdbool.h'はかなりシンプルです。 – endolith

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)   \ 
) 

はその後、ページの下部にある「FXT」の本(リンクからたぶん

int a = 0x123; 
SETBITS(a, BIN(0,0,0,1, 1,1,1,0)); 
printf("0x%x", a); // should be 0x13F 
+3

溶液を半分。 GETBITマクロも必要です。そしてループ。私は数日後に私の投稿をします。 –

2

algorithmsを書くことができます)が役立つでしょう。