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(). - При работе с аппаратными регистрами убедитесь, что вы понимаете назначение каждого бита по даташиту: случайная установка неверного бита может изменить режим работы периферии.