#include <stdint.h>
#define BITS_PER_WORD 32
#define BITMAP_SHIFT 5
#define BITMAP_MASK 0x1F //0001 1111 →31
#define BITMAP_SIZE(bits) ((bits + BITS_PER_WORD - 1) >> BITMAP_SHIFT) //÷32,凑1
typedef struct {
uint32_t* array; //无符号整数
size_t bits; //位的个数
} BitMap;
BitMap* bitmap_create(size_t bits) {
BitMap* bm = malloc(sizeof(BitMap));
bm->array = calloc(BITMAP_SIZE(bits), sizeof(uint32_t));
bm->bits = bits;
return bm;
}
void bitmap_destroy(BitMap* bm) {
free(bm->array);
free(bm);
}
void grow_capacity(BitMap* bm, size_t bits) {
bm->array = realloc(bm->array, BITMAP_SIZE(bits) * sizeof(uint32_t));
//初始化为0
int bytes = (BITMAP_SIZE(bits) - BITMAP_SIZE(bm->bits)) * sizeof(uint32_t);
memset(bm->array + BITMAP_SIZE(bm->bits), 0, bytes);
}
void bitmap_set(BitMap* bm, size_t n) {
if (n + 1 > bm->bits) {
if (BITMAP_SIZE(n + 1) > BITMAP_SIZE(bm->bits)) {
grow_capacity(bm, n + 1);
}
bm->bits = n + 1;
}
size_t word = n >> BITMAP_SHIFT;
size_t offset = n & BITMAP_MASK; //n%32
bm->array[word] |= (0x1 << offset);
}
void bitmap_unset(BitMap* bm, size_t n) {
if (n >= bm->bits) return;
size_t word = n >> BITMAP_SHIFT;
size_t offset = n & BITMAP_MASK;
//置0
bm->array[word] &= ~(0x1 << offset);
}
bool bitmap_isset(BitMap* bm, size_t n) {
if (n >= bm->bits) {
return false;
}
size_t word = n >> BITMAP_SHIFT;
size_t offset = n & BITMAP_MASK;
return bm->array[word] & (0x1 << offset);
}
void bitmap_clear(BitMap* bm) {
memset(bm->array, 0, BITMAP_SIZE(bm->bits) * sizeof(uint32_t));
}
【C语言】24_结构体实现位图
最新推荐文章于 2024-07-09 21:36:59 发布