我有一个大小为10的数组
我想跟踪数组中的可用空间,我被告知位图是一个更好的选择。
例如索引2和3为空,我可以在索引2处记录位0,在位图中记录3
如何使用默认的0位创建大小为10的位图?
欢迎使用有关位图的有用链接。
提前致谢
答案 0 :(得分:1)
C对“位图”类型没有任何第一类支持;你将不得不自己实施它。它非常简单,只需使用无符号整数数组和一些按位移位/逻辑运算符。
类似的东西:
typedef struct {
unsigned int *bits;
size_t size;
} bitmap;
#define BITS (CHAR_BIT * sizeof (unsigned int))
bitmap * bitmap_new(size_t size)
{
const size_t length = (size + BITS - 1) / BITS;
const size_t bytes = length * sizeof (unsigned int);
bitmap *b = malloc(sizeof *b + bytes);
if (b != NULL)
{
b->bits = (unsigned int *) (b + 1);
memset(b->bits, 0, length);
b->size = size;
}
return b;
}
bool bitmap_test(const bitmap *b, size_t index)
{
if (index < b->size)
{
const size_t ii = index / BITS;
const unsigned int ib = index % BITS;
return (bool) ((b->bits[ii] & (1u << ib)) != 0);
}
return false;
}
void bitmap_set(bitmap *b, size_t index)
{
if (index < b->size)
{
const size_t ii = index / BITS;
const unsigned int ib = index % BITS;
b->bits[ii] |= (1u << ib);
}
}
以上是未经测试的,但你应该得到主要想法。