Битовые массивы - это просто байтовые массивы, в которых вы используете битовые операторы для чтения отдельных битов.
Предположим, у вас есть 1-байтовая char
переменная.Это содержит 8 бит.Вы можете проверить, является ли младший бит истинным, выполнив побитовую операцию И со значением 1, например,
char a = /*something*/;
if (a & 1) {
/* lowest bit is true */
}
Обратите внимание, что это одиночный амперсанд.Он полностью отличается от логического оператора AND &&
.Это работает, потому что a & 1
будет «маскировать» все биты, кроме первого, и поэтому a & 1
будет отличен от нуля тогда и только тогда, когда младший бит a
равен 1. Аналогично, вы можете проверить, является ли второй младший битtrue для AND с 2, а третий для AND с 4 и т. д. для продолжения степеней, равных двум.
Таким образом, битовый массив из 32 768 элементов будет представлен как 4096-элементный байт массив, где первый байт содержит биты 0-7, второй байт содержит биты 8-15 и т. д. Чтобы выполнить проверку, код должен выбрать байт из массива, содержащего бит, который он хотел проверить, и затем использоватьпобитовая операция чтения битового значения из байта.
Что касается операций, как и любого другого типа данных, вы можете читать значения и записывать значения.Я объяснил, как читать значения выше, и я объясню, как записывать значения ниже, но если вы действительно заинтересованы в понимании побитовых операций, прочитайте ссылку, которую я предоставил в первом предложении.
Как вы пишетебит зависит от того, хотите ли вы записать 0 или 1. Чтобы записать 1-бит в байт a
, вы выполняете операцию, противоположную операции AND: операции OR, например,
char a = /*something*/;
a = a | 1; /* or a |= 1 */
После этого младший бит a
будет установлен в 1 независимо от того, был ли он установлен ранее или нет.Опять же, вы можете записать это во вторую позицию, заменив 1 на 2, или на третью на 4, и т. Д. Для степеней двух.
Наконец, чтобы записать нулевой бит, вы И с инверсия позиции, в которую вы хотите записать, например,
char a = /*something*/;
a = a & ~1; /* or a &= ~1 */
Теперь самый младший бит a
установлен в 0, независимо от его предыдущего значения.Это работает, потому что ~1
будет иметь все биты , отличные от , самый низкий из которых установлен в 1, а самый низкий из них установлен в ноль.Это «маскирует» младший бит до нуля и оставляет остальные биты a
в покое.