В документации PHP о JSON упоминается битовая маска слова. Википедия определила его как маску. Я не понимаю ни битмаски, ни маски, или как они полезны. Может кто-нибудь объяснить эти термины, используя термины непрофессионала и не жаргон?
Что такое битовая маска и маска?
Ответ 1
Биты и байты
В вычислениях числа внутренне представлены в двоичном формате. Это означает, что при использовании целочисленного типа для переменной это будет внутренне отображаться как суммирование нулей и единиц.
Как вы знаете, один бит представляет один 0
или один 1
. Конкатенация восьми из этих битов представляет собой байт, например 00000101
, который является числом 5. 00000101
, вы знаете, как числа представлены в двоичном формате, если нет, посмотрите здесь.
В PHP число (в основном) 4 байта. Это означает, что ваш номер фактически использует 32 бита внутренней памяти. Но для простоты, на протяжении всего этого ответа я буду использовать 8-битные номера.
Сохранение состояний в битах
Теперь представьте, что вы хотите создать программу, которая содержит состояние, основанное на нескольких значениях, которые являются одним (true
) или нулевым (false
). Можно хранить эти значения в разных переменных, они могут быть логическими или целыми. Или вместо этого используйте единую целочисленную переменную и используйте каждый бит своих внутренних 32 бит, чтобы представить разные истины и фальши.
Пример: 00000101
. Здесь первый бит (чтение справа налево) является истинным, что представляет собой первую переменную. Второй - false, который представляет вторую переменную. Третья правда. И так далее...
Это очень компактный способ хранения данных и имеет множество применений.
Бит-маскировка
Это то, где приходит бит-маскирование. Это звучит сложно, но на самом деле это очень просто.
Бит-маскировка позволяет использовать операции, которые работают на уровне бит.
- Редактирование отдельных битов в байтах (байтах)
- Проверка наличия конкретных значений бит или нет.
Вы на самом деле применяете маску к значению, где в нашем случае это наше состояние 00000101
а маска снова является двоичным числом, которое указывает интересующие биты.
Выполняя двоичные операции с маской и состоянием, можно добиться следующего:
- Оператор AND извлекает подмножество бит в состоянии
- Оператор OR устанавливает подмножество бит в состоянии
- Оператор XOR переключает подмножество бит в состоянии
Если мы хотим установить определенное значение true, мы могли бы сделать это, используя оператор OR и следующую битовую маску:
Mask: 10000000b
Value: 00000101b
---- OR ---------
Result: 10000101b
Или можно выбрать конкретное значение из состояния с помощью оператора И:
Mask: 00000100b
Value: 00000101b
---- AND ---------
Result: 00000100b
Я предлагаю вам глубже изучить его и познакомиться с жаргоном. Хорошим началом может быть эта ссылка.
Удачи!
Ответ 2
Это просто число, представленное в двоичном формате. Например, допустим, что у меня есть 8 логических значений (true
или false
), которые я хочу сохранить. Я мог бы хранить его как массив из 8 логических элементов, или я мог бы хранить его в виде одного байта (8 бит), каждый из которых хранит одно из булевых (0
= false
, 1
= true
).
На этом этапе я могу легко манипулировать моим байтом, чтобы я мог (1) устанавливать или отключать определенные биты (true или false) и (2) проверять, включены ли определенные биты.
- Чтобы установить бит в 1:
mask = mask | (1 << bitIndex)
mask = mask | (1 << bitIndex)
- Чтобы установить бит в 0:
mask = mask & ~(1 << bitIndex)
- Чтобы получить немного (чтобы проверить его):
(mask & (1 << bitIndex)) != 0
Во всех этих операциях используется оператор сдвига влево, который перемещает биты с наименее значимых до наиболее значимых позиций.
Ответ 3
По сути, Bitmask представляет собой список булевых флагов (например, isAlive, isMoving и т.д.), Сжатых в одно поле, обычно целое. Он может вырезать довольно значительное количество размера строки JSON или объема памяти.
Это может быть значительным, особенно в PHP, где одно логическое значение в массиве может принимать то же количество ОЗУ, что и целое число. Существует очень простое руководство по битмаску, которое будет объяснять шаг за шагом все, что вам нужно знать, в том числе, как и когда его использовать.