hex — Как декодировать шестнадцатеричную битовую маску с помощью php?

У меня есть база данных с полем, содержащим битовую маску, и у меня есть список шестнадцатеричной битовой маски, который выглядит следующим образом:

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.

0

Решение

Во-первых, вы должны определить константы для ваших значений:

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!

0

Другие решения

Других решений пока нет …