Запрос растрового изображения, различающего 0-значений - PullRequest
0 голосов
/ 10 августа 2011

Я пишу программный продукт, который будет обрабатывать огромные объемы данных. Для повышения эффективности памяти некоторые поля в обрабатываемых записях хранятся в одном растровом изображении.

Используя #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-значений?

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Вы, вероятно, хотите что-то вроде этого:

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, и возвращает true, если этот конкретный бит равен 1, и false в противном случае.

0 голосов
/ 10 августа 2011

В качестве решения я бы определил и передал маску, а не позицию и размер, поэтому, если вы хотите получить 2-битные данные из позиций 3 и 4 из 8-битной карты, вы должны определить

#define mask = 0x18;//binary 00011000

тогда в проверочном бите вам нужно:

return (map & mask) == value;
...