Битовые маски


Битовая маскировка - это просто процесс хранения данных в виде битов, а не в виде символов / целых чисел / чисел с плавающей запятой. Это невероятно полезно для компактного и эффективного хранения определенных типов данных.

Идея битовой маскировки основана на логической логике. Для тех, кто не знаком, логическая логика - это манипуляция «истиной» (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

storage |= 1 << n;

В качестве примера, вот установка бита 3, где storage- символ (8 бит):

01000010 OR 00001000 == 01001010

Логика помещает «1» значение на должном бита в самой маски, обеспечивая доступ к той же бит в переменной для хранения.2^n

Сброс бита n

Бит очистки nявляется результатом операции И над значением переменной хранения с инверсией (НЕ) значения :2^n

storage &= ~(1 << n);

И снова пример:

01001010 AND 11110111 == 01000010

Перекидной бит n

Бит переворота nявляется результатом операции XOR для значения переменной хранения с помощью :2^n

storage ^= 1 << n;

01000010 01001010 XOR XOR 00001000 00001000 == == 01001010 01000010

Проверка бита n

Проверка бита - это операция И для значения с битовым хранилищем:2^n

bit = storage & (1 << n);

01000010 01001010 AND AND 00001000 00001000 == == 00000000 00001000

Упражнение

Используйте битовые маски для управления некоторыми флагами.