我正在编写一个处理大量数据的软件。为了提高内存效率,正在处理的记录中的一些字段存储在一个位图中。
使用#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值的同时做到这一点?
答案 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;