У меня есть база данных с полем, содержащим битовую маску, и у меня есть список шестнадцатеричной битовой маски, который выглядит следующим образом:
2^8 256 = Type 1
2^9 512 = Type 2
2^0 001 = Type 3
2^4 016 = Type 4
2^1 002 = Type 5
2^5 032 = Type 6
Я пытаюсь «расшифровать» (не уверен в правильном термине)
с php, что такое битовая маска, например: 003
Откуда мне знать, что 003
была комбинация 002 & 001
?
Пожалуйста, я ничего не знаю об этом, помогите пролить свет.
Мне нужно быть в состоянии сделать это с php.
Во-первых, вы должны определить константы для ваших значений:
const TYPE1 = 0b01000000;
const TYPE2 = 0b10000000;
const TYPE3 = 0b00000001;
const TYPE4 = 0b00010000;
const TYPE5 = 0b00000010;
const TYPE6 = 0b00100000;
Это будет держать вас в здравом уме. Я использовал бинарный (0b
нотации), но вы могли бы использовать hex (0x
) или так же легко десятичной; Я думаю, что двоичный код позволяет легче увидеть, какой бит представляет какую константу, и когда вы определяете новые константы, вы можете легко увидеть, какие биты уже были использованы. Имейте в виду, что имена констант чувствительны к регистру … но просто придерживайтесь констант ALL_CAPS, и вы избавите себя от головной боли в будущем.
Тогда вы можете использовать логический оператор &
проверить для каждого, согласно комментарию @MarkBaker:
if ($mask & TYPE1) echo "Type 1 is set\n";
if ($mask & TYPE2) echo "Type 2 is set\n";
if ($mask & TYPE3) echo "Type 3 is set\n";
if ($mask & TYPE4) echo "Type 4 is set\n";
if ($mask & TYPE5) echo "Type 5 is set\n";
if ($mask & TYPE6) echo "Type 6 is set\n";
Для вашего примера значения 3 вы получите вывод:
Type 3 is set
Type 5 is set
Кроме того, предостережение при работе в PHP (и многих других языках) — числа, написанные с начальным нулем, например 032 в вашем вопросе, интерпретируются как восьмеричные! Следовательно 032
на самом деле не 32
, скорее 26
!
Других решений пока нет …