Что такое маска в программировании
Перейти к содержимому

Что такое маска в программировании

  • автор:

Маска (вычисление) — Mask (computing)

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

  • 1 Общие функции битовой маски
    • 1.1 Маскирование битов до 1
    • 1.2 Маскирование битов до 0
    • 1.3 Запрос состояния бита
    • 1.4 Переключение значений битов
    • 2.1 Аргументы функций
    • 2.2 Обратные маски
    • 2.3 Маски изображений
    • 2.4 Хеш-таблицы

    Общие функции битовых масок

    Маскирование биты на 1

    Для включения определенных битов может использоваться побитовая операция OR , следуя принципу, согласно которому Y OR 1 = 1 и Y ИЛИ 0 = Y . Следовательно, чтобы убедиться, что бит включен, можно использовать OR с 1 . Чтобы оставить бит неизменным, используется OR с 0 .

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

    1001 0101 1010 0101 OR 1111 0000 1111 0000 = 1111 0101 1111 0101

    Биты маскирования для 0

    На практике биты чаще «замаскированы» (или замаскированы до 0 ), чем «замаскированы» (или замаскированы как 1 ). Когда бит И объединен с 0, результатом всегда будет 0, то есть Y AND 0 = 0 . Чтобы оставить другие биты такими, какими они были изначально, их можно соединить И с 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

    Запрос состояния бита

    Можно использовать битовые маски, чтобы легко проверить состояние отдельных битов независимо от других битов. Для этого отключение всех других битов с помощью побитового И выполняется, как описано в выше, и значение сравнивается с 1 . Если он равен 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 , результатом будет 0 , но если только один из них будет 1 , результатом будет 1 . Следовательно, инверсия значений битов выполняется с помощью XOR , обрабатывая их с 1 . Если исходный бит был 1 , он возвращает 1 XOR 1 = 0 . Если исходный бит был 0 , он возвращает 0 XOR 1 = 1 . Также обратите внимание, что маскирование XOR является бит-безопасным, что означает, что оно не повлияет на немаскированные биты, потому что Y XOR 0 = Y , как и OR .

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

    10011101 10010101 XOR 00001111 11111111 = 10010010 01101010

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

    регистр = (регистр ~ битовая маска) | значение;

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

    Групповой трюк для угадывания числа, на каких картах он напечатан, использует биты двоичного представления числа. В файле 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 и glCle>ar объявлен как

    void glClear (биты GLbitfield);

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

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

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

    void glClear (GLbitfield bits)  if ((bits GL_DEPTH_BUFFER_BIT)! = 0) if ((bits GL_ACCUM_BUFFER_BIT)! = 0) if ((bits GL_STENCIL_BUFFER_BIT)! = 0) >

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

    Обратные маски

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

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

    сетевой адрес (двоичный) 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 (обратная маска)

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

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

    Маски изображения

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

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

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

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

    Рендеринг спрайтов с помощью двоичного изображения mask.png

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

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

    Хеш-таблицы

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

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

    #include #include int main (void) 

    См. Также

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

    Битовая маска

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

    «IT-специалист с нуля» наш лучший курс для старта в IT

    Битовые маски требуются для работы с двоичными числами, в которых хранится массив булевых значений. Булево значение — логическое, оно может быть равно 1 или 0, где 1 — это «да», а 0 — это «нет». Поэтому хранить такие значения в виде длинных двоичных чисел разумно. А чтобы получить из последовательности конкретное значение, нужна маска — двоичное число, которое «высвечивает» из массива нужный бит.

    Где применяются битовые маски

    Битовые строки нужны для хранения большого количества булевых значений. Одно двоичное число или булево значение занимает один бит. Если создать для него целую переменную, потратится как минимум байт, то есть восемь бит. А если хранить все в виде одного числа, в восьми битах удастся уместить восемь значений, то есть в восемь раз больше. Каждому биту будет соответствовать свое значение. Такой способ хранения позволяет оптимизировать код.

    Хранение свойств объектов. Битовые маски бывают нужны при работе с объектами, у которых много свойств, в том числе тех, которые можно представить в виде булевых значений. Свойства хранятся в виде двоичных строк, маска нужна для получения значения определенного свойства.

    Профессия / 8 месяцев
    IT-специалист с нуля

    Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

    vsrat_7 1 (1)

    Динамическое программирование. Это способ решения сложных задач: они декомпозируются на маленькие и решаются поэтапно. Программа формируется так, чтобы каждая маленькая подзадача решалась только один раз, а потом исполнение переходило на другую.

    Обычно динамическое программирование используют для задач, связанных с графами и траекториями. Например, с помощью ДП на битовых масках можно написать решение знаменитой задачи коммивояжера — сложного задания на поиск оптимальной траектории.

    Ассемблер. Язык ассемблера — это низкоуровневый язык, который переводится в машинные коды. На нем обычно пишут системные программисты, специалисты, которые работают с «железом», создают драйверы и подобное программное обеспечение. Иногда части кода на ассемблере нужны при разработке высокоуровневых программ.

    На низком уровне важно сохранение каждого бита, поэтому информация хранится в виде битовых строк — выделять целый байт на одно логическое значение нерационально. Логических значений на близком к «железу» уровне много: это сигналы на входах процессора, наличие значения в том или ином регистре и так далее. Данные надо не только хранить, и получать. Поэтому маски в подобных задачах используются часто.

    Работа с сетью. Например, чтобы проверить принадлежность IP-адреса к определенной сети или узнать адрес устройства, используется маска подсети. Это тоже битовая маска, а IP-адрес — строка, которая представляется в двоичном виде.

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

    Как работает битовая маска

    Хранение. Например, есть три вопроса и ответы на них. Если на первый и второй вопросы ответы даны правильный, а на третий — неверно, получится список значений формата «правда, правда, ложь». Это булевы значения. В двоичном представлении их можно отобразить как 110, это число и есть битовая строка.

    Плюс такого представления в том, что место для записи экономится, а последовательность значений не теряется благодаря разрядности. Если мы посмотрим на строку, то с легкостью можем ответить, на какие именно вопросы был дан правильный ответ.

    Маскирование. Компьютер воспринимает информацию иначе. Ему нельзя сказать: «Посмотри на первый бит и выдай его значение» — нужно использовать маску. Например, чтобы узнать, какой ответ был дан на второй вопрос, потребуется маска 010 — единица стоит в том бите, значение которого мы хотим получить. А затем нужно применить побитовую операцию сложения — о ней мы подробнее поговорим ниже.

    Побитовые операции. Работать с масками можно благодаря побитовым операциям — они попарно сравнивают конкретные биты двух чисел и применяют к ним логические операции. Первый бит одного числа сравнится с первым битом другого, второй — со вторым, и так далее. Это похоже на сложение и вычитание в столбик, когда человек работает с цифрами попарно. Только вместо сложения и вычитания — логические операции. Они возвращают 1 или 0 в зависимости от результатов сравнения.

    Они могут быть следующими:

    • логическое «И» — дает результат 1, если значения обоих битов равны 1, в остальных случаях 0;
    • логическое «ИЛИ» — дает результат 1, если значение хотя бы одного бита равно 1;
    • логическое исключающее «ИЛИ» — дает результат 1, если значения разные.

    Еще есть логическое «НЕ», которое инвертирует бит, но эта операция, в отличие от предыдущих, унарная — ей нужна не пара битов для сравнения, а один бит для инверсии.

    Курс для новичков «IT-специалист
    с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

    Возможные операции с битовыми масками

    Перечисленные выше логические операции — основной инструмент работы с битовыми масками. Они побитово сравнивают двоичную строку с маской, выдают результат, и этот результат устанавливает, обнуляет или получает конкретное значение.

    Установка значения. Происходит с помощью логического «ИЛИ». Если у нас есть строка 1000, и мы хотим установить в первый с конца бит 1, мы пишем маску 0001 и применяем операцию «строка ИЛИ маска», «1000 ИЛИ 0001». Результат побитовой операции — число 1001. Значение добавлено.

    Снятие значения. Происходит с помощью исключающего «ИЛИ». Чтобы убрать последнюю единицу из полученного числа, понадобится операция «1001 исключающее ИЛИ 0001». Последняя цифра изменится на 0, потому что значение в строке и значение в маске — одинаковые.

    Проверка значения. Происходит с помощью логического «И». Чтобы узнать, какой будет первая слева цифра в нашем числе, нужна маска 1000. При побитовой операции «1001 И 1000» результатом будет 1000 — это показывает, что нужный бит равен 1. А при операции «0001 И 1000» получится 0000 — это показывает, что бит равен 0.

    Чтобы получить нужный бит, вместе с логическим «И» применяют побитовый сдвиг, когда разряды числа как бы «сдвигают» в сторону, пока нужный не станет первым справа. Биты считаются справа налево, поэтому в числе 1000 бит со значением 1 — четвертый. Мы назвали его первым слева для наглядности.

    В каких языках можно встретить битовые маски

    В целом — в любых, где есть работа с двоичными строками. Но шанс встретить такую задачу, например, во фронтенде, в разы ниже, чем в системном программировании. Чем ниже уровень, то есть чем ближе разработка к «железной» части компьютеров, тем чаще придется работать с битовыми масками. С ними могут столкнуться разработчики на ассемблере, на C/C++ или Java, на других языках, которые используются как системные.

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

    IT-специалист с нуля

    Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

    Битовая маска

    Битовая маска — определённые данные, которые используются для маскирования — выбора отдельных битов или полей из нескольких битов из двоичной строки или числа.

    Применение

    Например, для получения значения пятого бита (считая слева) числа 10111011 нужно использовать маску 00001000 и применить операцию побитового логического «И» (конъюнкцию). В результате получится:

    10111011 & 00001000 = 00001000

    Подобное число на языках, использующих вместо логического типа числовые типы, например в Си, будет означать истину или ложь, если этот бит принимает соответствующее значение. На языках, например, C++, имеющие логические типы, необходимо произвести приведение типа.

    Использование

    Основные плюсы и недостатки:

    • Экономия памяти — требуется бит для хранения информации, а не байт.
    • Неэффективно по производительности.

    Сфера использования в основном в интерфейсах, где приоритет отдаётся экономии памяти:

    • выбор битов из слова состояния, идущие с пакетом по интерфейсу, например, контрольная сумма;
    • выбор битов из IP-адреса для адресации подсети (см. маска подсети) 255.255.224.0

    См. также

    • Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
    • Добавить иллюстрации.
    • Двоичная арифметика

    Wikimedia Foundation . 2010 .

    Полезное

    Смотреть что такое «Битовая маска» в других словарях:

    • Маска (значения) — Маска: В Викисловаре есть статья «маска» Маска предмет, накладка на лицо, который надевается, чтобы не быть узнанным либо для защиты лица … Википедия
    • Битовая карта — (англ. bitmap, bitset, bit array) набор последовательно записанных двоичных разрядов, то есть последовательность (массив) битов. Содержание 1 Применение 1.1 В цифровых изображениях … Википедия
    • Маска подсети — В терминологии сетей TCP/IP маской подсети или маской сети называется битовая маска, определяющая, какая часть IP адреса узла сети относится к адресу сети, а какая к адресу самого узла в этой сети. Например, узел с IP адресом 12.34.56.78 и… … Википедия
    • Маска сети — В терминологии сетей TCP/IP маской подсети или маской сети называется битовая маска, определяющая, какая часть IP адреса узла сети относится к адресу сети, а какая к адресу самого узла в этой сети. Например, узел с IP адресом 12.34.56.78 и маской … Википедия
    • адресная маска — Битовая маска, используемая для выбора битов из адреса IP для адресации подсети. Маска имеет размер 32 бита и выделяет адреса IP сети и один или несколько битов адреса хоста. Иногда называется маской подсети. … … Справочник технического переводчика
    • Битовый вектор — Битовая карта (англ. bitmap, bitset, bit array) набор последовательно записанных двоичных разрядов, то есть последовательность (массив) битов. Содержание 1 Применение 1.1 В цифровых изображениях 1.2 … Википедия
    • Битовый массив — Битовая карта (англ. bitmap, bitset, bit array) набор последовательно записанных двоичных разрядов, то есть последовательность (массив) битов. Содержание 1 Применение 1.1 В цифровых изображениях 1.2 … Википедия
    • Вихрь Мерсенна — (англ. Mersenne twister, MT) генератор псевдослучайных чисел (ГПСЧ), разработанный в 1997 году японскими учёными Макото Мацумото (яп. 松本 眞) и Такудзи Нисимура (яп. 西村 拓士). Вихрь Мерсенна основывается на свойствах простых чисел Мерсенна… … Википедия
    • SSE4 — SSE4 новый набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD)[1]. Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной… … Википедия
    • SSE4.1 — SSE4 это новый набор команд Intel Core микроархитектуры, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD). Он был анонсирован 27 Сентября 2006, однако детальное описание стало доступно только весной 2007, свежее … Википедия
    • Обратная связь: Техподдержка, Реклама на сайте
    • �� Путешествия

    Экспорт словарей на сайты, сделанные на PHP,
    WordPress, MODx.

    • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
    • Искать во всех словарях
    • Искать в переводах
    • Искать в ИнтернетеИскать в этой же категории

    Правило использования битовых масок

    Битовая маска – определённые данные, которые используются для маскирования – выбора отдельных битов из двоичной строки. Подобное число будет означать истину или ложь, если этот бит принимает соответствующее значение ( 1 – true , 0 – false ).

    Битовая маска бывает двух видов

    11111111 – однобайтовая, состоит из 8 бит, задает максимум 8 флагов (параметров).

    11111111 11111111 11111111 11111111 – четырехбайтовая, состоит из 32 бит задает максимум 32 флага (параметра).

    Каждый 1 бит принимает значение флага (какого-либо параметра).

    Значения флагов (параметров)

    Далее флаги принимают значение равное: 2 в степени N-1, где N – порядковый номер флага.

    Пример постановки значений битовой маски

    Необходимо задать значение true у 2 и 8 флагов.

    1. Получаем двоичное число 10000010, где 2 и 8 бит принимают значение «истина».
    2. Переводим двоичное число в десятичную систему счисления и получаем искомое значение битовой маски: 130.

    Пример расшифровки битовой маски

    Задано значение битовой маски: 36.

    Чтобы посмотреть, какие флаги активны, переведем число 36 в двоичную систему счисления:

    36/2=18 остаток 0
    18/2=9 остаток 0
    9/2=4 остаток 1
    4/2=2 остаток 0
    2/2=1 остаток 0
    1/2=0 остаток 1

    Значение true установлено у флагов 3, 6.

    Битовая маска используется для установки значений некоторых полей базы данных кассы, в объектах шаблонов документов.

    Пример установки значений свойств товара при помощи битовой маски

    В базе данных поле op_mode задается при помощи битовой маски.

    • 1 – запретить продажу товара;
    • 2 – запретить возврат товара;
    • 4 – не показывать товар в списках;
    • 8 – запретить возврат товара в чеке продажи;
    • 16 – товар требует визуального контроля;
    • 32 – товар ограничен в продаже по возрасту;
    • 64 – товар ограничен в продаже по времени;
    • 128 – товар с признаком «алкогольный», требует регистрации в ЕГАИС;
    • 256 – товар с установленным признаком «расфасованный», на такой товар не применяется скидка на набор;
    • 512 – алкогольный товар без акцизной марки, не требующий проверку в ЕГАИС;
    • 1024 – алкогольный набор;
    • 2048 – товар по свободной цене;
    • 4096 – меховое изделие;
    • 8192 – товар без контроля веса;
    • 16384 – легкий товар;
    • 32768 – табачная продукция;
    • 65536 – обувной товар;
    • 131072 – товар с неточным контрольным весом.

    Чтобы задать товару свойства: запретить возврат товара и запретить возврат товара в чеке продажи, необходимо установить значение битовой маски равное 10(8+2).

    • Нет меток

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *