gpt4 book ai didi

c++ - 查询区分 0 值的位图

转载 作者:行者123 更新时间:2023-11-28 08:17:53 25 4
gpt4 key购买 nike

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

我使用 #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 值?

最佳答案

你可能想要这样的东西:

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_bitPosition 在 a_bitMap 中设置/未设置的位,如果该特定位为 1 则返回 true,否则返回 false。

关于c++ - 查询区分 0 值的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7008323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com