C ++:我需要一些如何创建动态大小的位图的指导

时间:2012-04-09 22:46:14

标签: c++ bitmap database

我正在尝试创建一个简单的DBMS,虽然我已经阅读了很多关于它并且已经设计好了系统,但我对实现有一些问题。

我需要知道C ++中使用一系列长度为动态的比特的最佳方法是什么。将保存这一系列位,以便确定文件中的哪些页面是空闲的而不是空闲的。对于单个文件,使用的页数将是固定的,因此我可以使用bitset。但是,每页AND文件的记录数将不会被修复。所以我认为bitset不是最好的方法。

我想也许只是使用一个字符序列,因为每个字符是1字节= 8位可能如果我使用它们的数组我将能够创建我想要的位图。

我从来没有必要在如此低的水平上操作位,所以我真的不知道是否还有其他更好的方法可以做到这一点,或者即使这种方法完全有效。

提前致谢

2 个答案:

答案 0 :(得分:0)

我会实现一个包装器类,只是将你的位图存储在一个链接的块列表中,其中每个块将保存一个固定大小的数组(我会使用类似uint32_t的stdint类型来确保给定的位数)然后你只需添加链接到您的列表以进行扩展。我会把签约作为练习留给读者。

答案 1 :(得分:0)

如果你只是想要了解这个基础上的基础知识,以下是使用字符数组进行操作的一种方法。

假设您有一个数组(长度需要为(totalitems / 8 )):

unsigned char *bits;  // this of course needs to be allocated somewhere

您可以计算数组中的索引以及该位置内的特定位,如下所示:

// compute array position
int pos = item / 8;  // 8 bits per byte
// compute the bit within the byte.  Could use "item & 7" for the same
// result, however modern compilers will typically already make
// that optimization.
int bit = item % 8;

然后您可以检查是否使用以下设置位(假设从零开始索引):

if ( bits[pos] & ( 1 << bit ))
  return 1;  // it is set
else
  return 0;  // it is not set

以下将设置一个特定位:

bits[pos] |= ( 1 << bit );

以下内容可用于清除特定位:

bits[pos] &= ~( 1 << bit );