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

bitSet()

bitSet(x, n) устанавливает бит с номером n в переменной x в 1, не затрагивая остальные — удобно при работе с регистрами, флагами и побитовым управлением периферией.

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

Описание

bitSet() принудительно выставляет указанный бит числовой переменной в 1, не затрагивая остальные биты. Это классическая операция при низкоуровневом программировании: управление флагами состояния, настройка аппаратных регистров микроконтроллера или работа с периферией через регистры ввода-вывода.

Важно понимать, что функция именно устанавливает бит — если он уже был равен 1, значение переменной не изменится.

Синтаксис

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

bitSet(x, n)

Параметры

Функция допускает следующие параметры:

  • x: числовая переменная, бит которой необходимо установить.
  • n: какой бит установить, начиная с 0 для младшего (крайнего правого) бита.

Нумерация битов идёт справа налево: бит 0 — это самый правый (младший), бит 7 — самый левый в байте. Для типа int (16 бит на AVR-платах) допустимы позиции от 0 до 15.

Возвращает

Функция возвращает значение числовой переменной после того, как бит в позиции n установлен в 1.

Обратите внимание: bitSet() изменяет переменную x на месте и возвращает её новое значение. Можно использовать результат напрямую в выражении, но чаще достаточно просто вызвать функцию — переменная обновится автоматически.

Пример кода

Изменить данный байт x превратив его 5-й бит в 1:

uint8_t x = 0b10000001; // исходный байт 

void setup() {
  Serial.begin(9600);
  
  int index = 5; // индекс изменяемого бита
  
  x = bitSet(x, index-1);

  Serial.print("The resulting byte is: ");
  Serial.println(x, BIN);
 
}

void loop() {
}

Примечание

Упрощённо bitSet() можно представить так:

#define bitSet(value, bit) ((value) |= (1UL << (bit)))

Под капотом bitSet() использует побитовое ИЛИ с маской, где единица стоит на нужной позиции. Это стандартный приём для работы с регистрами и наборами флагов.

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

  • Управление регистрами AVR — например, включить определённый режим таймера или разрешить прерывание, выставив нужный бит в регистре конфигурации.
  • Работа с флагами — хранить несколько булевых состояний в одной переменной типа byte или uint8_t, экономя память.
  • Протоколы с побитовой передачей — формировать байт команды для SPI- или I²C-устройства, выставляя нужные биты перед отправкой.
  • Отладка через Serial — быстро проверить, как меняется значение переменной после установки конкретного бита, выведя его в Serial Monitor.

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

  • Позиция бита n отсчитывается от нуля. Бит 0 — младший, бит 7 — старший в байте. Не путайте с порядковым номером «слева».
  • Если передать n, выходящее за разрядность переменной (например, n = 8 для byte), поведение не определено — результат может быть неожиданным.
  • bitSet() модифицирует оригинальную переменную напрямую, поэтому передавать в неё константу нельзя — только переменную.
  • Для обратной операции (сброс бита в 0) используйте bitClear(), для чтения — bitRead(), для записи произвольного значения — bitWrite().
  • При работе с аппаратными регистрами убедитесь, что вы понимаете назначение каждого бита по даташиту: случайная установка неверного бита может изменить режим работы периферии.

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