Главная chevron_right Структура chevron_right Побитовые операторы chevron_right << (bitshift left)

<< (bitshift left)

Оператор << сдвигает биты числа влево на заданное число позиций — удобен для создания битовых масок (1 << n) и быстрого умножения на степень двойки.

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

Описание

Оператор побитового сдвига влево << перемещает все биты левого операнда на указанное количество позиций в сторону старших разрядов. Освободившиеся младшие биты заполняются нулями.

Синтаксис

variable << number_of_bits;

Параметры

  • variable: переменная, биты которой нужно сдвинуть. Допустимые типы данных: byte, int, long.
  • number_of_bits: количество позиций для сдвига, не больше 32. Допустимый тип данных: int.

Пример кода

    int a = 5;      // двоичное: 0000000000000101
    int b = a << 3; // двоичное: 0000000000101000, или 40 в десятичной

Примечания и предупреждения

При сдвиге значения x на y позиций влево (x << y) старшие y битов числа безвозвратно теряются — они просто выходят за пределы разрядной сетки типа:

    int x = 5;  // двоичное: 0000000000000101
    int y = 14;
    int result = x << y;  // двоичное: 0100000000000000 — первая 1 в 101 была отброшена

Если вы уверены, что ни один значимый бит не «вылетает» за пределы, сдвиг влево на y позиций равнозначен умножению на 2 в степени y. Это удобно, когда нужно быстро получить степени двойки:

ОперацияРезультат
1 << 01
1 << 12
1 << 24
1 << 38
......
1 << 8256
1 << 9512
1 << 101024
......

Следующий пример показывает, как с помощью сдвига влево вывести двоичное представление байта в Serial Monitor — перебирая биты от младшего (LSB) к старшему (MSB):

    // Выводит двоичное значение (1 или 0) байта
    void printOut1(int c) {
      for (int bits = 7; bits > -1; bits--) {
        // Сравниваем биты 7–0 в байте
        if (c & (1 << bits)) {
          Serial.print("1");
        }
        else {
          Serial.print("0");
        }
      }
    }

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

  • Работа с битовыми масками — формирование маски для конкретного бита: 1 << n даёт число, у которого установлен только бит с номером n.
  • Упаковка данных — объединение нескольких значений в одно число, например, сборка байта из отдельных флагов или полей.
  • Быстрое умножение на степень двойки — в ситуациях, где важна скорость вычислений на микроконтроллере без FPU.
  • Вывод двоичного представления — последовательный перебор битов числа для отладки через Serial Monitor.

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

  • Следите за типом переменной: если variable имеет тип byte (8 бит), сдвиг на 8 и более позиций обнулит результат полностью.
  • Сдвиг значения типа int на 15 позиций влево затронет знаковый бит — это может привести к неожиданному отрицательному результату. Если нужны только положительные числа, используйте беззнаковые типы или long.
  • Выражение 1 << n вычисляется как int. Если нужна маска для 32-битного числа, пишите 1L << n, чтобы явно задействовать тип long.
  • Сдвиг на отрицательное число или на величину, превышающую разрядность типа, формально является неопределённым поведением в C/C++ — избегайте таких ситуаций.
  • Оператор << не изменяет саму переменную — он возвращает новое значение. Чтобы сохранить результат, используйте присваивание: variable = variable << n; или сокращённо variable <<= n;.

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