Главная chevron_right Функции chevron_right Биты и байты chevron_right bitWrite()

bitWrite()

Записывает 0 или 1 в заданный бит числовой переменной — удобная альтернатива ручным битовым маскам с |= и &= ~.

Полная статья

Описание

bitWrite() позволяет изменить один конкретный бит числовой переменной, не затрагивая остальные. Функция работает с целочисленными типами — bool, int, long и другими вплоть до unsigned long (32 бита / 4 байта). Типы float и double не поддерживаются, поскольку их внутреннее представление с плавающей точкой не предполагает побитовой адресации.

Это удобный способ управлять флагами, регистрами или упакованными данными без ручного написания битовых масок и операций |= / &= ~.

Синтаксис

Чтобы записать значение b в бит на позиции n переменной x, используйте:

bitWrite(x, n, b)

Параметры

  • x — числовая переменная, бит которой нужно изменить. Передаётся по имени; функция изменяет её на месте.
  • n — номер бита, считая с 0 для младшего (крайнего правого) бита. Бит 0 — это единицы, бит 7 — старший бит однобайтового числа.
  • b — значение для записи: 0 сбрасывает бит, 1 устанавливает его.

Возвращает

Функция ничего не возвращает (void). Результат отражается непосредственно в переменной x.

Пример кода

Пример ниже демонстрирует работу bitWrite: значение переменной выводится в Serial Monitor до и после вызова bitWrite().

void setup() {
  Serial.begin(9600);
  while (!Serial) {}  // ожидание подключения serial порта. Нужно только для нативного USB порта
  byte x = 0b10000000;  // префикс 0b указывает на двоичную константу
  Serial.println(x, BIN); // 10000000
  bitWrite(x, 0, 1);  // записываем 1 в младший бит x
  Serial.println(x, BIN); // 10000001
}

void loop() {}

Где применяется

  • Управление несколькими флагами в одной переменной. Когда нужно хранить набор булевых состояний компактно — например, статусы восьми датчиков в одном byte.
  • Формирование команд для периферии. Некоторые устройства принимают байты конфигурации, где каждый бит отвечает за отдельную настройку.
  • Работа с протоколами без аппаратной поддержки. При программной реализации SPI или других побитовых протоколов удобно собирать байт бит за битом через bitWrite().
  • Отладка битовых масок. Можно последовательно устанавливать и сбрасывать биты, наблюдая результат в Serial Monitor, чтобы убедиться в правильности логики.

Практические замечания

  • Нумерация битов начинается с нуля: бит 0 — младший, бит 7 — старший для byte, бит 31 — старший для unsigned long. Если указать номер бита, выходящий за разрядность переменной, поведение непредсказуемо.
  • bitWrite() изменяет переменную напрямую — убедитесь, что она не объявлена как const.
  • Для чтения отдельного бита используйте bitRead(), для установки — bitSet(), для сброса — bitClear(). Эти функции образуют единый набор для побитовой работы.
  • Если нужно передать значение не 0 или 1, а произвольное ненулевое число в параметре b, функция всё равно запишет 1: любое ненулевое значение интерпретируется как «бит установлен».
  • Типы float и double не поддерживаются — компилятор может не выдать ошибку, но результат будет некорректным. Используйте bitWrite() только с целочисленными типами.

Полезные материалы