我正在尝试创建一个简单的DBMS,虽然我已经阅读了很多关于它并且已经设计好了系统,但我对实现有一些问题。
我需要知道C ++中使用一系列长度为动态的比特的最佳方法是什么。将保存这一系列位,以便确定文件中的哪些页面是空闲的而不是空闲的。对于单个文件,使用的页数将是固定的,因此我可以使用bitset。但是,每页AND文件的记录数将不会被修复。所以我认为bitset不是最好的方法。
我想也许只是使用一个字符序列,因为每个字符是1字节= 8位可能如果我使用它们的数组我将能够创建我想要的位图。
我从来没有必要在如此低的水平上操作位,所以我真的不知道是否还有其他更好的方法可以做到这一点,或者即使这种方法完全有效。
提前致谢
答案 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 );