【C语言】24_结构体实现位图

#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));
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值