Я пишу программный продукт, который будет обрабатывать огромные объемы данных. Для повышения эффективности памяти некоторые поля в обрабатываемых записях хранятся в одном растровом изображении.
Используя #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-значений?