查询可区分0的位图

Querying a bitmap distinguishing 0-values

本文关键字:位图 可区分 查询      更新时间:2023-10-16

我正在编写一个处理大量数据的软件。为了提高内存效率,正在处理的记录中的一些字段存储在单个位图中。

使用#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;