Оператор сдвига влево << заставляет биты левого операнда сдвигаться влево на количество позиций, указанных правым операндом.
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-биты в x теряются:
int x = 5; // в двоичной: 0000000000000101 int y = 14; int result = x << y; // в двоичной: 0100000000000000 - первая 1 в 101 исчезла.
Если вы уверены, что ни одно из значений в значении не смещено, простой способ думать об операторе левого сдвига состоит в том, что он умножает левый операнд на 2, возведенный в степень правого операнда. Например, для генерации степеней 2 могут использоваться следующие выражения:
Операция | Результат |
1 << 0 | 1 |
1 << 1 | 2 |
1 << 2 | 4 |
1 << 3 | 8 |
... | ... |
1 << 8 | 256 |
1 << 9 | 512 |
1 << 10 | 1024 |
... | ... |
В следующем примере можно распечатать значение полученного байта на последовательном мониторе, используя оператор сдвига влево для перемещения вдоль байта снизу (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"); } } }