使用位图跟踪数组

时间:2018-03-08 13:04:19

标签: c arrays bitmap bitmapdata

我有一个大小为10的数组

我想跟踪数组中的可用空间,我被告知位图是一个更好的选择。

例如索引2和3为空,我可以在索引2处记录位0,在位图中记录3

如何使用默认的0位创建大小为10的位图?

欢迎使用有关位图的有用链接。

提前致谢

1 个答案:

答案 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);
  }
}

以上是未经测试的,但你应该得到主要想法。