bitRead()
bitRead(x, n) читает значение одного бита переменной по его номеру — удобно для разбора флагов статуса, отладки и работы с протоколами без ручных масок и сдвигов.
Полная статья
Описание
bitRead() возвращает значение одного бита из переменной по указанной позиции. Функция работает с целочисленными типами — например, bool или int — и поддерживает переменные размером до unsigned long long (64 бита / 8 байт). Типы float и double не поддерживаются: числа с плавающей точкой хранятся в памяти в формате IEEE 754, и побитовое чтение их содержимого не имеет практического смысла.
Биты нумеруются начиная с нуля: бит 0 — это самый правый (младший) бит, бит 7 — старший бит однобайтовой переменной и так далее.
Синтаксис
Чтобы прочитать состояние бита на позиции n в переменной x, используйте:
bitRead(x, n)
Параметры
x— переменная, из которой нужно прочитать бит. Подходит любой целочисленный тип вплоть доunsigned long long.n— номер бита, считая от 0 (младший, крайний правый бит). Например, для восьмибитной переменной допустимые значения — от 0 до 7.
Возвращает
Функция возвращает 0 или 1 — значение запрошенного бита.
Пример кода
Пример ниже демонстрирует работу bitRead() на двух счётчиках: один увеличивается, другой уменьшается. Для каждого из них в Serial Monitor выводятся двоичное и десятичное представления. Функция последовательно перебирает все биты переменной, начиная с младшего, и печатает каждый.
readBit()
long negative_var = -0; //
unsigned long long positive_var = 0;
//заранее заданные размеры для перебора битов
//например, long_size равен 32 битам (то есть 0-31). Поэтому вычитаем «1».
const int bool_size = (1 - 1);
const int int_size = (8 - 1);
const int long_size = (32 - 1);
void setup() {
Serial.begin(9600);
}
void loop() {
//вызываем функцию readBit, передавая положительную и отрицательную переменные
readBit("Positive ", positive_var);
readBit("Negative ", negative_var);
Serial.println();
//увеличиваем и уменьшаем переменные
negative_var--;
positive_var++;
delay(1000);
}
/*эта функция принимает переменную, выводит её побитово (начиная справа),
затем выводит десятичное число для сравнения.*/
void readBit(String direction, long counter) {
Serial.print(direction + "Binary Number: ");
//перебираем каждый бит
for (int b = long_size; b >= 0; b--) {
byte bit = bitRead(counter, b);
Serial.print(bit);
}
Serial.print(" Decimal Number: ");
Serial.println(counter);
}
Где применяется
- Разбор флагов состояния. Когда периферийное устройство возвращает байт статуса, каждый бит означает отдельный флаг.
bitRead()позволяет проверить нужный флаг без ручных масок и сдвигов. - Отладка числовых переменных. Удобно вывести в Serial Monitor побитовое представление переменной и убедиться, что данные записаны корректно.
- Работа с протоколами. При ручной реализации последовательных протоколов (например, при программном управлении линией данных)
bitRead()помогает извлекать биты из байта по одному. - Анимация и матричные эффекты. Можно хранить паттерн светодиодной матрицы в числе и читать биты, чтобы определить, какой светодиод включить.
Практические замечания
- Если передать в
nзначение, выходящее за пределы разрядности переменной (например, бит 10 дляbyte), поведение непредсказуемо — всегда проверяйте диапазон. bitRead()— это макрос, а не полноценная функция. Он раскрывается в выражение с побитовым сдвигом и маской, поэтому никакого накладного расхода на вызов нет.- Типы
floatиdoubleпередавать нельзя — компилятор выдаст ошибку или вернёт бессмысленный результат. - Для записи бита существует парная функция
bitWrite(), для установки в 1 —bitSet(), для сброса в 0 —bitClear(). - Результат
bitRead()удобно сразу использовать в условииif, поскольку 0 соответствуетfalse, а 1 —true.