<< (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 << 0 | 1 |
| 1 << 1 | 2 |
| 1 << 2 | 4 |
| 1 << 3 | 8 |
| ... | ... |
| 1 << 8 | 256 |
| 1 << 9 | 512 |
| 1 << 10 | 1024 |
| ... | ... |
Следующий пример показывает, как с помощью сдвига влево вывести двоичное представление байта в 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;.