Самый эффективный способ извлечь битовые флаги

У меня есть эти возможные битовые флаги.

1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536

Таким образом, каждое число похоже на истинный/ложный оператор на стороне сервера. Таким образом, если первые 3 объекта, и только первые 3 объекта будут отмечены "верные" на стороне сервера, то веб-сервис возвратит 7. Или если бы все 14 объектов выше верны, я все еще вернул бы единственное число от веб-сервиса, который является, сумма всех тех чисел.

Что лучший способ состоит в том, чтобы обработать число, которое я возвращаю для обнаружения, какие объекты отмечены как "верные"?

9
задан Nathan 7 May 2010 в 21:50
поделиться

3 ответа

if (7 & 1) { // if bit 1 is set in returned number (7)

}
7
ответ дан 4 December 2019 в 10:30
поделиться

Используйте оператор битовой маскировки. На языке C:

 X & 8

истинно, если установлен бит «8».

Вы можете перечислить битовые маски и подсчитать, сколько их установлено.

Если это действительно так, что все слово содержит биты, и вы хотите просто вычислить, сколько битов установлено, вам, по сути, нужен «подсчет населения». Абсолютный самый быстрый способ получить счетчик населения - это выполнить собственный "popcnt", обычно доступный в наборе команд вашего компьютера.

Если вас не волнует пространство, вы можете создать массив counttedbits [...] , индексированный по вашему значению, с предварительно вычисленными счетчиками битов. Затем при однократном доступе к памяти вычисляется ваш битовый счет.

Часто используется простой «битовый код» , который вычисляет количество битов:

(метод Кернигана):

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
  v &= v - 1; // clear the least significant bit set
}

(параллельное суммирование битов, 32 бита)

v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count

Если у вас нет ' Я раньше не видел хитрых приемов, вас ждет угощение.

PHP, будучи забавным, может делать забавные вещи с некоторыми из этих арифметических действий.

6
ответ дан 4 December 2019 в 10:30
поделиться

Один из способов - перебрать ваш номер в цикле, сдвигая его влево (т. Е. Разделить на 2 ) и сравните первый бит с 1 с помощью операнда &.

1
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: