web-dev-qa-db-ja.com

Cのビットマップとは何ですか?

ビットマップは ビットの配列 です。 Cではどのように実装されていますか?

16
mohan

Cでビットマップ(またはビット配列)を実装する方法を尋ねていると思います。驚いたことに、 Bit_array エントリウィキペディアで概念を説明していますが、実際には基本的な操作を実装する方法を示していないので、ここに行きます。

要するに、お気に入りの符号なし型の配列を作成し、正しい演算を実行して、その中のビットを設定/クリアする方法を決定します。

#include <limits.h>    /* for CHAR_BIT */
#include <stdint.h>   /* for uint32_t */

typedef uint32_t Word_t;
enum { BITS_PER_Word = sizeof(Word_t) * CHAR_BIT };
#define Word_OFFSET(b) ((b) / BITS_PER_Word)
#define BIT_OFFSET(b)  ((b) % BITS_PER_Word)

void set_bit(Word_t *words, int n) { 
    words[Word_OFFSET(n)] |= (1 << BIT_OFFSET(n));
}

void clear_bit(Word_t *words, int n) {
    words[Word_OFFSET(n)] &= ~(1 << BIT_OFFSET(n)); 
}

int get_bit(Word_t *words, int n) {
    Word_t bit = words[Word_OFFSET(n)] & (1 << BIT_OFFSET(n));
    return bit != 0; 
}
47
Dale Hagglund