WikiDer > Маска (вычисление)
Эта статья в значительной степени или полностью полагается на один источник. (Апрель 2020 г.) |
В Информатика, а маска или же битовая маска это данные, которые используются для побитовые операции, особенно в битовое поле. Используя маску, несколько битов в байт, клев, слово и т.д. могут быть включены, выключены или инвертированы с включения на выключение (или наоборот) в одной побитовой операции.
Общие функции битовой маски
Биты маскировки в 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.