查询可区分0的位图
Querying a bitmap distinguishing 0-values
我正在编写一个处理大量数据的软件。为了提高内存效率,正在处理的记录中的一些字段存储在单个位图中。
使用#define
s,我声明了位图中每个字段的位置和大小。
现在我需要一种快速的方法来检查预定义的值。我的第一次尝试是这样的:
bool checkBit(unsigned short int a_bitMap, unsigned short int a_bitValue, unsigned short int a_bitPosition)
{
// Values are always bit-0 based, so we need to shift here
unsigned short int _value = (a_bitValue << a_bitPosition);
return ((a_bitMap & _value) == _value);
}
这里,a_bitMap是正在处理的记录的位图,包含所有字段的数据,a_bitValue是(定义的)被检查的编码值(在标记的情况下,它总是为1)。
这工作,是快速的,但这种方式我不能使用值'0'作为一个编码值(所以3位给我只有7个选项,而不是8),所以我想出了这个解决方案:
bool checkBit(unsigned short int a_bitMap, unsigned short int a_bitValue, unsigned short int a_bitPosition, unsigned short int a_bitSize)
{
static const unsigned short int bitmapSize = 8 * sizeof(a_bitMap);
unsigned short int _shift = bitmapSize - (a_bitPosition + a_bitSize);
a_bitMap = (a_bitMap << _shift);
a_bitMap = (a_bitMap >> (a_bitPosition + _shift));
return (a_bitMap == a_bitValue);
}
这正是我想要的方式…但它大大减缓了这个过程。需要处理的记录数量达到数十亿,因此这些额外的班次会产生巨大的影响。这也是为什么我要避免std::bitset,因为数十亿的对象实例化也会带来太多的开销。
我怎么能做到这一点,同时仍然能够区分0值?
您可能想要这样的内容:
bool checkBit(unsigned short int a_bitMap, unsigned short int a_bitPosition)
{
unsigned short int _value = (1 << a_bitPosition);
return (a_bitMap & _value) != 0;
}
检查a_bitMap中a_bitPosition的位设置/取消设置,如果该位为1则返回true,否则返回false。
作为一种解决方案,我将定义并传递一个掩码而不是位置和大小,所以如果你想从位置3和4的8位映射中获得2位数据,你可以定义
#define mask = 0x18;//binary 00011000
然后在检查位你只需要:
return (map & mask) == value;
相关文章:
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- 如何从路径字符串加载Gdiplus::位图
- 在C++中使用Gdiplus创建透明位图
- 用C++压缩内存中的位图
- C++gdi::内存中的位图到PNG图像
- C++ WinRT - 如何动态缩放可写位图以匹配当前屏幕分辨率
- 如何将可折叠元素(Qmenu,Qcombobox)渲染到使用QT的位图缓冲液
- 正在从可执行资源中读取位图
- 查询可区分0的位图