Что такое битовая маска и маска?

В документации 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, где одно логическое значение в массиве может принимать то же количество ОЗУ, что и целое число. Существует очень простое руководство по битмаску, которое будет объяснять шаг за шагом все, что вам нужно знать, в том числе, как и когда его использовать.