У меня есть эти возможные битовые флаги.
1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536
Таким образом, каждое число похоже на истинный/ложный оператор на стороне сервера. Таким образом, если первые 3 объекта, и только первые 3 объекта будут отмечены "верные" на стороне сервера, то веб-сервис возвратит 7. Или если бы все 14 объектов выше верны, я все еще вернул бы единственное число от веб-сервиса, который является, сумма всех тех чисел.
Что лучший способ состоит в том, чтобы обработать число, которое я возвращаю для обнаружения, какие объекты отмечены как "верные"?
if (7 & 1) { // if bit 1 is set in returned number (7)
}
Используйте оператор битовой маскировки. На языке 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, будучи забавным, может делать забавные вещи с некоторыми из этих арифметических действий.
Один из способов - перебрать ваш номер в цикле, сдвигая его влево (т. Е. Разделить на 2 ) и сравните первый бит с 1 с помощью операнда &.