0

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

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

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

我从来不需要在如此低的级别上操作位,所以我真的不知道是否还有其他更好的方法可以做到这一点,或者即使这种方法是否可行。

提前致谢

4

2 回答 2

0

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

于 2012-04-09T23:21:54.970 回答
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 );
于 2012-04-10T16:11:24.647 回答