C中的位图是什么?

16 c bitmap

位图是位数组.它是如何在C中实现的?

Dal*_*und 46

我假设您正在询问如何在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; 
}
Run Code Online (Sandbox Code Playgroud)

  • 文字“1”是常规的带符号的“int”,这会引发两个问题:不能保证是 32 位,并且“1 &lt;&lt; 31”是未定义的行为(因为符号位)。上面代码中的所有文字“1”都应替换为无符号的 32 位“(word_t) 1”。 (2认同)