Маска (вычисление) - Mask (computing)
В Информатика, а маска или же битовая маска это данные, которые используются для побитовые операции, особенно в битовое поле. Используя маску, несколько битов в байт, клев, слово и т.д. могут быть включены, выключены или инвертированы с включения на выключение (или наоборот) в одной побитовой операции.
Общие функции битовой маски
Биты маскировки в 1
Чтобы включить определенные биты, побитовый ИЛИ ЖЕ
операция может быть использована, после принцип который ДА ИЛИ 1 = 1
и ДА ИЛИ 0 = Д
. Поэтому, чтобы убедиться, что бит включен, ИЛИ ЖЕ
может использоваться с 1
. Чтобы оставить немного без изменений, ИЛИ ЖЕ
используется с 0
.
Пример: маскирование на выше клев (биты 4, 5, 6, 7) младший полубайт (биты 0, 1, 2, 3) без изменений.
10010101 10100101 ИЛИ 11110000 11110000 = 11110101 11110101
Биты маскировки в 0
Чаще на практике биты «маскируются» выключенный"(или замаскировано 0
) чем "замаскированный на"(или замаскировано 1
). Когда немного И
ed с 0, результат всегда 0, т.е. ДА И 0 = 0
. Чтобы остальные части оставались такими, какими они были изначально, их можно И
Эд с 1
в качестве ДА И 1 = Д
Пример: маскирование выключенный выше клев (биты 4, 5, 6, 7) младший полубайт (биты 0, 1, 2, 3) без изменений.
10010101 10100101AND 00001111 00001111 = 00000101 00000101
Запрос статуса бита
Можно использовать битовые маски, чтобы легко проверить состояние отдельных битов независимо от других битов. Для этого отключив все остальные биты с помощью побитового И
делается, как обсуждалось над и значение сравнивается с 0
. Если он равен 0
, то бит был выключен, но если значение - любое другое значение, то бит был включен. Что делает это удобным, так это то, что нет необходимости выяснять, каково значение на самом деле, просто это не 0
.
Пример: запрос состояния 4-го бита
10011101 10010101И 00001000 00001000 = 00001000 00000000
Переключение битовых значений
До сих пор в статье говорилось о том, как включать и выключать биты, но не то и другое сразу. Иногда не имеет значения, какое значение имеет значение, но оно должно быть противоположным тому, что есть в настоящее время. Этого можно добиться с помощью XOR
(Эксклюзивный или) операция. XOR
возвращается 1
если и только если ан нечетное число бит 1
. Следовательно, если два соответствующих бита 1
, результатом будет 0
, но если только один из них 1
, результат будет 1
. Поэтому инверсия значений битов выполняется XOR
их с 1
. Если исходный бит был 1
, он возвращается 1 исключающее ИЛИ 1 = 0
. Если исходный бит был 0
он возвращается 0 исключающее ИЛИ 1 = 1
. Также обратите внимание, что XOR
маскирование является битобезопасным, что означает, что оно не повлияет на немаскированные биты, потому что Y XOR 0 = Y
, как и ИЛИ ЖЕ
.
Пример: переключение битовых значений
10011101 10010101XOR 00001111 11111111 = 10010010 01101010
Чтобы записать произвольные единицы и нули в подмножество битов, сначала запишите 0 в это подмножество, затем установите старшие биты:
register = (регистр & ~ битовая маска) | ценить;
Использование битовых масок
Аргументы к функциям
В языках программирования, таких как 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 ()
объявлен как
пустота glClear(GLbitfield биты);
Тогда вызов функции выглядит так
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Внутренне функция, принимающая такое битовое поле, может использовать двоичный и
для извлечения отдельных битов. Например, реализация glClear ()
может выглядеть так:
пустота glClear(GLbitfield биты) { если ((биты & GL_COLOR_BUFFER_BIT) != 0) { // Очистить буфер цвета. } если ((биты & GL_DEPTH_BUFFER_BIT) != 0) { // Очистить буфер глубины. } если ((биты & GL_ACCUM_BUFFER_BIT) != 0) { // Очистить буфер накопления. } если ((биты & GL_STENCIL_BUFFER_BIT) != 0) { // Очистить буфер трафарета. }}
Преимущество этого подхода состоит в том, что уменьшаются накладные расходы на аргумент функции. Поскольку минимальный размер данных составляет один байт, разделение параметров на отдельные аргументы приведет к потере семи бит на аргумент и займет больше места в стеке. Вместо этого функции обычно принимают одно или несколько 32-битных целых чисел, каждое из которых содержит до 32 битов параметров. Несмотря на элегантность, в простейшей реализации это решение не типобезопасный. А GLbitfield
просто определяется как беззнаковое целое
, поэтому компилятор разрешил бы бессмысленный вызов 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. В примере справа черные пиксели имеют нулевые биты, а белые пиксели - все единицы.
В время выполнения, чтобы поместить изображение на экран поверх фона, программа сначала маскирует биты пикселя экрана маской изображения в желаемых координатах, используя побитовое И операция. Это сохраняет фоновые пиксели прозрачных областей и обнуляет биты пикселей, которые будут скрыты перекрывающимся изображением.
Затем программа визуализирует биты пикселя изображения, комбинируя их с битами фонового пикселя, используя побитовое ИЛИ операция. Таким образом, пиксели изображения размещаются надлежащим образом с сохранением окружающих пикселей фона. В результате получается идеальное соединение изображения с фоном.
Этот метод используется для рисования курсоров указывающих устройств в типичных 2-мерных видеоиграх для символов, пуль и т. Д. спрайты ), за GUI иконки, а также для титров видео и других приложений для смешивания изображений.
Хотя они связаны (поскольку используются для тех же целей), прозрачные цвета и альфа-каналы представляют собой методы, которые не включают смешение пикселей изображения путем двоичного маскирования.
Хеш-таблицы
Чтобы создать хеш-функцию для хеш-таблица, часто используется функция с большим доменом. Чтобы создать индекс из выходных данных функции, можно взять по модулю, чтобы уменьшить размер домена, чтобы он соответствовал размеру массива; однако на многих процессорах часто быстрее ограничить размер хеш-таблицы степенями двух размеров и вместо этого использовать битовую маску.
Пример как по модулю, так и маскировки в C:
#включают <stdint.h>#включают <string.h>int главный(пустота) { 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 = НОЛЬ; // Обработка выделения памяти для token_array… char жетон[] = "некоторое хешируемое значение"; uint32_t hashed_token = hash_function(жетон, Strlen(жетон), NUM_BUCKETS); // Использование по модулю size_t индекс = hashed_token % MAX_RECORDS; // ИЛИ ЖЕ // Использование битовой маски size_t индекс = hashed_token & HASH_BITMASK; *(token_array+индекс) = жетон; // Освободить память из token_array… возвращаться 0;}
Смотрите также
Рекомендации
- ^ «Маска R-CNN с OpenCV». PyImageSearch. 2018-11-19. Получено 2020-04-05.