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

C++: I need some guidance in how to create dynamic sized bitmaps

本文关键字:动态 创建 位图 何创建 C++      更新时间:2023-10-16

我正在尝试创建一个简单的DBMS,尽管我已经阅读了很多关于它并且已经设计了系统的信息,但我在实现方面遇到了一些问题。

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

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

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

提前致谢

如果您只是想要有关位摆动的基础知识,以下是使用字符数组的一种方法。

假设你有一个位数组(长度需要(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 );

我将实现一个包装类,并简单地将位图存储在块的链接列表中,其中每个块将保存一个固定大小的数组(我会使用像 uint32_t 这样的 stdint 类型来确保给定的位数),然后您只需将链接添加到列表中即可扩展。我将把合同作为一种练习留给读者。