C++:我需要一些有关如何创建动态大小位图的指导
C++: I need some guidance in how to create dynamic sized bitmaps
我正在尝试创建一个简单的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 类型来确保给定的位数),然后您只需将链接添加到列表中即可扩展。我将把合同作为一种练习留给读者。
相关文章:
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- 如何在C++中为堆栈动态创建结构?
- 如何使用类型级函数动态创建静态类型?
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 如何设置动态创建的CMFCToolbar的原始状态?
- 我可以动态创建新地图并作为函数参数传递吗?
- 如何在循环中动态创建变量(c++)
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 在堆或堆栈上分配的动态创建的字符串 - C
- "动态创建的事件处理程序"复选框
- 在字符串数组中动态创建和存储数据
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 为动态创建的数组使用静态关键字有什么意义吗?
- 有没有办法基于文本文件动态创建对象?
- 从类 c++ 动态创建数组
- 如何在循环中动态创建类对象?
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 使用 createComponent 动态创建 QML 对象