Правило использования битовых масок
Битовая маска – определённые данные, которые используются для маскирования – выбора отдельных битов из двоичной строки. Подобное число будет означать истину или ложь, если этот бит принимает соответствующее значение ( 1 – true , 0 – false ).
Битовая маска бывает двух видов
11111111 – однобайтовая, состоит из 8 бит, задает максимум 8 флагов (параметров).
11111111 11111111 11111111 11111111 – четырехбайтовая, состоит из 32 бит задает максимум 32 флага (параметра).
Каждый 1 бит принимает значение флага (какого-либо параметра).
Значения флагов (параметров)
Далее флаги принимают значение равное: 2 в степени N-1, где N – порядковый номер флага.
Пример постановки значений битовой маски
Необходимо задать значение true у 2 и 8 флагов.
- Получаем двоичное число 10000010, где 2 и 8 бит принимают значение «истина».
- Переводим двоичное число в десятичную систему счисления и получаем искомое значение битовой маски: 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).
- Нет меток
Битовая маска
Битовая маска — это двоичное число, которое нужно для получения определенных цифр из другого двоичного числа. С помощью специальных логических операций число сравнивают с маской и получают результат — значение конкретного бита или битов, то есть цифру.
«IT-специалист с нуля» наш лучший курс для старта в IT
Битовые маски требуются для работы с двоичными числами, в которых хранится массив булевых значений. Булево значение — логическое, оно может быть равно 1 или 0, где 1 — это «да», а 0 — это «нет». Поэтому хранить такие значения в виде длинных двоичных чисел разумно. А чтобы получить из последовательности конкретное значение, нужна маска — двоичное число, которое «высвечивает» из массива нужный бит.
Где применяются битовые маски
Битовые строки нужны для хранения большого количества булевых значений. Одно двоичное число или булево значение занимает один бит. Если создать для него целую переменную, потратится как минимум байт, то есть восемь бит. А если хранить все в виде одного числа, в восьми битах удастся уместить восемь значений, то есть в восемь раз больше. Каждому биту будет соответствовать свое значение. Такой способ хранения позволяет оптимизировать код.
Хранение свойств объектов. Битовые маски бывают нужны при работе с объектами, у которых много свойств, в том числе тех, которые можно представить в виде булевых значений. Свойства хранятся в виде двоичных строк, маска нужна для получения значения определенного свойства.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам
Динамическое программирование. Это способ решения сложных задач: они декомпозируются на маленькие и решаются поэтапно. Программа формируется так, чтобы каждая маленькая подзадача решалась только один раз, а потом исполнение переходило на другую.
Обычно динамическое программирование используют для задач, связанных с графами и траекториями. Например, с помощью ДП на битовых масках можно написать решение знаменитой задачи коммивояжера — сложного задания на поиск оптимальной траектории.
Ассемблер. Язык ассемблера — это низкоуровневый язык, который переводится в машинные коды. На нем обычно пишут системные программисты, специалисты, которые работают с «железом», создают драйверы и подобное программное обеспечение. Иногда части кода на ассемблере нужны при разработке высокоуровневых программ.
На низком уровне важно сохранение каждого бита, поэтому информация хранится в виде битовых строк — выделять целый байт на одно логическое значение нерационально. Логических значений на близком к «железу» уровне много: это сигналы на входах процессора, наличие значения в том или ином регистре и так далее. Данные надо не только хранить, и получать. Поэтому маски в подобных задачах используются часто.
Работа с сетью. Например, чтобы проверить принадлежность 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 — выберите подходящую и сразу освойте ее.
Что такое маска? Объясняем простыми словами
Пишем про дизайн и искусство. Всё, что вы хотели знать о настоящем, прошлом и будущем визуальной культуры.
Маска — это термин, который встречается и в дизайне, и в айти. Он означает одно и то же? Или в каждой области подразумевается своё значение?
Простыми словами объясняют, что такое маска, экспертка в композитинге Ольга Константинова и эксперт в веб-разработке Ануар Мендубаев.
Ольга Константинова
Специалистка по композитингу: создаёт целостные изображения, совмещая отдельные слои видеосъёмки, анимации, компьютерной графики. Работала в компании CG Factory и других крупных российских студиях, делала графику для фильмов «Экипаж», «Время первых», «Движение вверх», «Последний богатырь», «Сердце Пармы».
Ольга Константинова о маске на дизайнерском и композерском
Что такое маска в графике
Русское слово «маска» может путать. Когда мы слышим слово «маска», что мы себе представляем? Я, например, сразу думаю о карнавальной маске: человек надел на себя какую-то маску зайчика или снежинки и будто перевоплотился. Или из косметики маска: наносим, и получается лицо без морщин.
Но на языке компьютерной графики это понятие roto, и оно дословно переводится «внутри».
Rotoscoping — это буквально искусство обрисовки какого-то объекта, а на привычном русском — рисование маски на нём.
Маска — это специально созданная дизайнером или художником область применения определённого эффекта: изменения цвета, наложения капель дождя, блюра, изменения формы и так далее.
Что значит рисовать маску на объект
Это означает, что в кадре или на картинке есть какая-то конкретная область, с которой мы хотим работать. Например, поменять цвет футболки на человеке. И нам каким-то образом нужно выделить эту область и к ней применить другой цвет или перекрасить её.
Как рисуют маски на объектах
При работе в 2D-пространстве — с фотографией, иллюстрацией или шотом из видео — для этого есть два способа:
- Ручная обводка. Например, в Adobe Photoshop есть инструмент «лассо», с помощью которого можно захватить кусочек изображения и прицельно с ним работать. Эта обводка — маска.
- Кеинг. Это означает работать с конкретным цветом, оттенком, яркостью и так далее — например, с зелёным хромакеем. Мы выбираем зелёный цвет специальным инструментом и вычитаем его из изображения. Останутся только те части картинки, где зелёного нет. Это тоже маска.
У тех, кто работает с 3D-пространствами, тоже есть возможность выделять отдельные области какого-то объекта на модельке, но для этого уже используют не ротоскопинг и не кеинг. Они тоже рисуют маску, но по xyz-координатам в пространстве.
Что значит применять маски
Маску можно применять где угодно и для разных задач. Не только в обработке фотографий и компьютерной графике.
Например, как трафарет. Простой пример: надо нарисовать на асфальте указатель к ломбарду — текст со стрелочкой. Человек берёт трафарет с вырезанными контурами, брызгает баллончиком, и получается, что часть поверхности закрыта, а на отверстия он применяет краску. Или мы ходим на пляж и, чтобы плечи не сгорели, мажем их кремом — применяем защиту от солнца. На эту маску солнечные лучи не проходят, а всё остальное тело, естественно, сгорает.
Ануар Мендубаев
Team Lead Developer в Antro.cx
Битовые маски
Битовая маскировка — это просто процесс хранения данных в виде битов, а не в виде символов / целых чисел / чисел с плавающей запятой. Это невероятно полезно для компактного и эффективного хранения определенных типов данных.
Идея битовой маскировки основана на логической логике. Для тех, кто не знаком, логическая логика — это манипуляция «истиной» (1) и «ложью» (0) с помощью логических операций (которые принимают в качестве аргумента нули и единицы). Нас интересуют следующие операции:
- НЕ a — конечное значение противоположно входному значению (1 -> 0, 0 -> 1)
- a И b — если оба значения равны 1, конечное значение равно 1, в противном случае конечное значение равно 0
- a ИЛИ b — если одно из значений равно 1, конечное значение равно 1, в противном случае конечное значение равно 0
- a XOR b — если одно значение равно 1, а другое значение равно 0, конечное значение равно 1, в противном случае конечное значение равно 0
В вычислениях одно из этих истинных / ложных значений — это бит . Примитивы в C ( int , float , и т.д.) состоит из некоторого числа битов, где это число является кратным 8. Так , например, int может быть по меньшей мере 16 битов в размерах, где char может быть 8 бит. 8 бит обычно называют байтом . C гарантирует, что некоторые примитивы имеют размер не менее некоторого числа байтов. Введение в C11 позволяет программисту указывать целочисленные типы, которые составляют ровно некоторое количество байтов, что чрезвычайно полезно при использовании масок. stdint . h
Битовые маски часто используются при установке флагов. Флаги — это значения, которые могут находиться в двух состояниях, например, «включен / выключен» и «движется / неподвижен».
Установка бита n
Установка бита n так же проста, как операция ИЛИ значения переменной хранения со значением . 2 ^ n
В качестве примера, вот установка бита 3, где storage — символ (8 бит):
01000010 OR 00001000 == 01001010
Логика помещает «1» значение на должном бита в самой маски, обеспечивая доступ к той же бит в переменной для хранения. 2 ^ n
Сброс бита n
Бит очистки n является результатом операции И над значением переменной хранения с инверсией (НЕ) значения : 2 ^ n
01001010 AND 11110111 == 01000010
Перекидной бит n
Бит переворота n является результатом операции XOR для значения переменной хранения с помощью : 2 ^ n
01000010 01001010 XOR XOR 00001000 00001000 == == 01001010 01000010
Проверка бита n
Проверка бита — это операция И для значения с битовым хранилищем: 2 ^ n
bit = storage & ( 1
01000010 01001010 AND AND 00001000 00001000 == == 00000000 00001000
Упражнение
Используйте битовые маски для управления некоторыми флагами.