查询区分0值的位图

时间:2011-08-10 09:07:52

标签: c++ c bitmap bit-manipulation

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

使用#define我声明了位图中每个字段的位置和大小。

现在我需要一种快速检查预定义值的方法。我的第一次尝试是这样的:

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值的同时做到这一点?

2 个答案:

答案 0 :(得分:1)

你可能想要这样的东西:

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。

答案 1 :(得分:0)

作为一种解决方案,我定义并传入一个掩码,而不是位置和大小,所以如果你想要一个8位映射的位置3和4的2位数据,你要定义

#define mask = 0x18;//binary 00011000

然后在检查位中你只需要:

return (map & mask) == value;