Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В информатике , А маска или битовая маска это данные, используемые для битовых операций , в частности , в битовом поле . Используя маску, несколько битов в байтах , полубайтах , словах и т. Д. Могут быть включены, выключены или инвертированы с включения на выключение (или наоборот) в одной побитовой операции.

Общие функции битовой маски [ править ]

Биты маскировки для 1[ править ]

Чтобы включить определенные биты, можно использовать побитовыеOR операции, следуя принципу, что Y OR 1 = 1и Y OR 0 = Y. Поэтому, чтобы убедиться, что бит включен, ORего можно использовать с файлом 1. Чтобы оставить немного без изменений, ORиспользуется с расширением 0.

Пример: Маскировка на чем выше полубайте (биты 4, 5, 6, 7) нижняя часть байта (биты 0, 1, 2, 3) без изменений.

 1001 0101 1010 0101 ИЛИ 1111 0000 1111 0000 = 1111 0101 1111 0101

Биты маскировки для 0[ править ]

Чаще на практике, биты «замаскированы от » (или маскируются 0) , чем «маскируются на » (или маскируются 1). Когда бит ANDэд с 0, то результат всегда 0, то есть Y AND 0 = 0. Чтобы оставить остальные биты такими, какими они были изначально, их можно ANDредактировать 1какY AND 1 = Y

Пример: Маскировка от высших полубайт (биты 4, 5, 6, 7) нижней части байта (биты 0, 1, 2, 3) без изменений.

 1001 0101 1010 0101И 0000 1111 0000 1111 = 0000 0101 0000 0101

Запрос статуса бита [ править ]

Можно использовать битовые маски для простой проверки состояния отдельных битов независимо от других битов. Для этого отключение всех других битов с использованием побитового ANDвыполняется, как описано выше, и значение сравнивается с 0. Если он равен 0, то бит был выключен, но если значение - любое другое значение, то бит был включен. Что делает это удобным, так это то, что нет необходимости выяснять, каково значение на самом деле, просто это не так 0.

Пример: запрос состояния 4-го бита

 1001 1 101 1001 0 101И 0000 1 000 0000 1 000 = 0000 1 000 0000 0 000

Переключение битовых значений [ править ]

До сих пор в статье рассказывалось, как включать и выключать биты, но не то и другое сразу. Иногда на самом деле не имеет значения, какое значение имеет значение, но оно должно быть противоположным тому, что есть в настоящее время. Этого можно добиться с помощью операции XOR(исключающее или) . XORвозвращает 1 тогда и только тогда, когда нечетное количество битов 1. Следовательно, если два соответствующих бита равны 1, результатом будет a 0, но если только один из них 1, результат будет 1. Следовательно, инверсия значений битов выполняется путем XORих добавления с помощью a 1. Если исходный бит был 1, он возвращается 1 XOR 1 = 0. Если исходный бит был, 0он возвращается 0 XOR 1 = 1. Также обратите внимание, чтоXORмаскирование является бит-безопасным, что означает, что оно не повлияет на немаскированные биты, потому что Y XOR 0 = Y, как и файл OR.

Пример: переключение битовых значений

 10011101 10010101XOR 00001111 11111111 = 10010010 01101010

Чтобы записать произвольные единицы и нули в подмножество битов, сначала запишите 0 в это подмножество, а затем установите старшие биты:

 register = (регистр & ~ битовая маска) | ценить;

Использование битовых масок [ править ]

Уловка для вечеринки, позволяющая угадать число, на каких карточках оно напечатано, использует биты двоичного представления числа. В файле SVG щелкните карточку, чтобы переключить ее

Аргументы к функциям [ править ]

В языках программирования, таких как C , битовые поля - полезный способ передать набор именованных логических аргументов функции. Например, в графическом API OpenGL есть команда, glClear()очищающая экран или другие буферы. Он может очищать до четырех буферов (буферы цвета, глубины, накопления и трафарета ), поэтому авторы API могли потребовать, чтобы он принимал четыре аргумента. Но тогда обращение к нему выглядело бы так

 glClear ( 1 , 1 , 0 , 0 );  // На самом деле glClear работает не так и делает код нестабильным.

что не очень наглядно. Вместо того, существует четыре определенных поля бит, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, и GL_STENCIL_BUFFER_BITи glClear()объявлен

 void  glClear ( биты GLbitfield  );

Тогда вызов функции выглядит так

 glClear ( GL_COLOR_BUFFER_BIT  |  GL_DEPTH_BUFFER_BIT );

Внутренне функция, принимающая подобное битовое поле, может использовать двоичный код andдля извлечения отдельных битов. Например, реализация glClear()может выглядеть так:

void  glClear ( GLbitfield  bits )  {  if  (( bits  &  GL_COLOR_BUFFER_BIT )  ! =  0 )  {  // Очистить буфер цвета.  }  if  (( bits  &  GL_DEPTH_BUFFER_BIT )  ! =  0 )  {  // Очистить буфер глубины.  }  if  (( bits  &  GL_ACCUM_BUFFER_BIT )  ! =  0 )  {  // Очистить буфер накопления.  }  if  (( биты  &  GL_STENCIL_BUFFER_BIT)  ! =  0 )  {  // Очистить буфер трафарета.  } }

Преимущество этого подхода в том, что уменьшаются накладные расходы на аргумент функции. Поскольку минимальный размер данных составляет один байт, разделение параметров на отдельные аргументы приведет к потере семи бит на аргумент и займет больше места в стеке. Вместо этого функции обычно принимают одно или несколько 32-битных целых чисел, каждое из которых содержит до 32 битов параметров. Несмотря на элегантность, в простейшей реализации это решение небезопасно по типам . A GLbitfieldпросто определяется как an unsigned int, поэтому компилятор допускает бессмысленный вызов glClear(42)или даже glClear(GL_POINTS). В C ++ альтернативой было бы создание класса для инкапсуляции набора аргументов, которые glClear мог бы принять и которые можно было бы чисто инкапсулировать в библиотеке.

Обратные маски [ править ]

Маски используются с IP-адресами в IP ACL (списках контроля доступа), чтобы указать, что должно быть разрешено, а что запрещено. Чтобы настроить IP-адреса на интерфейсах, маски начинаются с 255 и имеют большие значения слева: например, IP-адрес 209.165.202.129 с маской 255.255.255.224. Маски для списков управления доступом IP обратные: например, маска 0.0.0.255. Иногда это называется обратной маской или подстановочной маской . Когда значение маски разбивается на двоичные (0 и 1), результаты определяют, какие биты адреса следует учитывать при обработке трафика. 0 указывает, что биты адреса должны быть учтены (точное совпадение); 1 в маске означает «все равно». Эта таблица дополнительно объясняет концепцию.

Пример маски:

сетевой адрес (трафик, который нужно обработать) 10.1.1.0

маска 0.0.0.255

сетевой адрес (двоичный) 00001010.00000001.00000001.00000000

маска (двоичная) 00000000.00000000.00000000.11111111

Основываясь на двоичной маске, можно увидеть, что первые три набора ( октета ) должны точно соответствовать заданному двоичному сетевому адресу (00001010.00000001.00000001). Последний набор чисел состоит из «безразлично» (.11111111). Следовательно, весь трафик, который начинается с 10.1.1. совпадает с последним октетом "безразлично". Следовательно, с этой маской обрабатываются сетевые адреса с 10.1.1.1 по 10.1.1.255 (10.1.1.x).

Вычтите нормальную маску из 255.255.255.255, чтобы определить инверсную маску ACL. В этом примере обратная маска определяется для сетевого адреса 172.16.1.0 с нормальной маской 255.255.255.0.

255.255.255.255 - 255.255.255.0 (нормальная маска) = 0.0.0.255 (обратная маска)

Эквиваленты ACL

Исходный / исходный-подстановочный знак 0.0.0.0/255.255.255.255 означает «любой».

Источник / подстановочный знак 10.1.1.2/0.0.0.0 такой же, как «хост 10.1.1.2».

Маски изображений [ править ]

Спрайты растровой графики (слева) и маски (справа)

В компьютерной графике , когда данное изображение предназначено для размещения поверх фона, прозрачные области могут быть указаны с помощью двоичной маски. [1] Таким образом, для каждого предполагаемого изображения фактически есть два растровых изображения : фактическое изображение, в котором неиспользуемым областям присваивается значение пикселя со всеми битами, установленными в 0, и дополнительная маска , в которой даются соответствующие области изображения. значение пикселя для всех битов установлено в 0, а для окружающих областей - значение всех битов, равное 1. В примере справа черные пиксели имеют нулевые биты, а белые пиксели - все единицы.

Во время выполнения , чтобы поместить изображение на экран поверх фона, программа сначала маскирует биты пикселя экрана с помощью маски изображения в желаемых координатах с помощью побитовой операции AND . Это сохраняет фоновые пиксели прозрачных областей и обнуляет биты пикселей, которые будут закрыты перекрывающимся изображением.

Затем программа визуализирует биты пикселя изображения, комбинируя их с битами фонового пикселя, используя операцию побитового ИЛИ . Таким образом пиксели изображения размещаются надлежащим образом с сохранением окружающих пикселей фона. В результате получается идеальное соединение изображения с фоном.

Этот метод используется для рисования курсоров указывающих устройств в типичных двухмерных видеоиграх для символов, маркеров и так далее ( спрайтов ), для значков графического интерфейса пользователя , а также для титров видео и других приложений для смешивания изображений.

Хотя прозрачные цвета и альфа-каналы связаны (поскольку используются для одних и тех же целей), это методы, которые не включают смешение пикселей изображения путем двоичного маскирования.

Хеш-таблицы [ править ]

Чтобы создать хеш-функцию для хеш-таблицы , часто используется функция с большим доменом. Чтобы создать индекс из вывода функции, можно взять по модулю, чтобы уменьшить размер домена, чтобы он соответствовал размеру массива; однако на многих процессорах часто бывает быстрее ограничить размер хэш-таблицы степенями двух размеров и вместо этого использовать битовую маску.

Пример как по модулю, так и маскировки в C:

#include  <stdint.h>#include  <string.h>int  main ( void )  {  const  uint32_t  NUM_BUCKETS  =  0xFFFFFFFF ;  // 2 ^ 32  const  uint32_t  MAX_RECORDS  =  1 << 10 ;  // 2 ^ 10  const  uint32_t  HASH_BITMASK  =  0x3FF ;  // (2 ^ 10) -1 char  ** token_array  =  NULL ;  // Обработка выделения памяти для token_array… char  token []  =  "какое-то хешируемое значение" ;  uint32_t  hashed_token  =  hash_function ( токен ,  strlen ( токен ),  NUM_BUCKETS ); // Использование по модулю  size_t  index  =  hashed_token  %  MAX_RECORDS ; // ИЛИ ЖЕ // Использование битовой маски  size_t  index  =  hashed_token  &  HASH_BITMASK ; * ( token_array + index )  =  токен ; // Освободить память от token_array…  return  0 ; }

См. Также [ править ]

  • Маска сродства
  • Битовое поле
  • Битовые манипуляции
  • Побитовая операция
  • Подсеть
  • Помеченный указатель
  • маска

Ссылки [ править ]

  1. ^ "Маска R-CNN с OpenCV" . PyImageSearch . 2018-11-19 . Проверено 5 апреля 2020 .