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

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.

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