Arduino:Справочник языка Arduino/Побитовые операторы/Операторы побитового сдвига влево и вправо
| Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing | 
Операторы побитового сдвига влево (<<) и вправо (>>)[1]
В языке C++ имеется два оператора для побитового сдвига: «<<» (для сдвига влево) и «>>» (для сдвига вправо). Эти операторы заставляют биты из левого операнда сдвинуться влево или вправо на количество позиций, указанных в правом операнде.
Более подробно о побитовых расчетах можно прочесть тут.
Синтаксис
переменная << количество_битов
переменная >> количество_битов
Параметры
переменная (байт, целое, длинное целое), количество_битов (целое <= 32)
Пример
int a = 5;        // в бинарном виде: 0000000000000101
int b = a << 3;   // в бинарном виде: 0000000000101000, или 40 в десятичном
int c = b >> 3;   // в бинарном виде: 0000000000000101, т.е. возврат к 5, с чего мы и начинали
Когда вы смещаете значение X на Y битов влево (X<<Y), то левые биты этого значения теряются, а точнее — вовсе перестают существовать.
int a = 5;        // в бинарном виде: 0000000000000101
int b = a << 14;  // в бинарном виде: 0100000000000000 – первая единица в «101», по сути, просто исчезает
В общем, работая с этими операторами, имеет смысл внимательней следить за тем, не исчезают ли нужные биты в небытие.
Кроме того, об этом операторе проще всего думать как об инструменте для возведения во вторую степень. Другими словами, смещение битов влево позволяет возводить исходное значение (в десятичном выражении) в степень двух.
Например, можно задействовать такие выражения:
1 <<  0  ==    1
1 <<  1  ==    2
1 <<  2  ==    4
1 <<  3  ==    8
...
1 <<  8  ==  256
1 <<  9  ==  512
1 << 10  == 1024
...
Когда вы смещаете значение X на Y битов вправо (X>>Y), и самым первым битом является «1», то результат зависит от того, какому типу данных соответствует значение X. Если X – это целое число, то первый бит будет знаковым битом, который будет определять, будет ли X значением с отрицательным числом или нет. В этом случае знаковый бит (по никому не ведомым причинам, корни которых затерялись где-то в далеком программистском прошлом) копируется в оставшиеся биты:
int x = -16;     // в бинарном виде: 1111111111110000
int y = x >> 3;  // в бинарном виде: 1111111111111110
Эта особенность, именуемая «знаковым расширением», зачастую бывает вовсе не нужна — например, в случаях, когда вы хотите, чтобы слева появлялись не нули, а единицы. Тут необходимо воспользоваться приведением типов данных и с его помощью сделать X беззнаковым целым числом, поскольку на него это знаковое расширение не действует. В результате слева будут появляться биты, скопированные справа:
int x = -16;                   // в бинарном виде: 1111111111110000
int y = (unsigned int)x >> 3;  // в бинарном виде: 0001111111111110
Если вам удалось избежать исчезновения нужных битов, то имейте в виду, что оператор «>>» можно использовать еще и как средство для низведения во вторую степень:
int x = 1000;
int y = x >> 3;   // делим целое число на 8, тем самым получая y = 125
См.также
Внешние ссылки
| Arduino продукты | |
|---|---|
| Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino | 
| Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter | 
| Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle | 
| Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap | 
| 3D-печать | Arduino Materia 101 | 
| Устаревшие устройства | - | 
| Примеры Arduino | |
|---|---|
| Стандартные функции | |
| Основы | 
  | 
| Цифровой сигнал | 
  | 
| Аналоговый сигнал | 
  | 
| Связь | 
  | 
| Управляющие структуры | 
  | 
| Датчики | 
  | 
| Дисплей | 
 Примеры, объясняющие основы управления дисплеем: 
  | 
| Строки | 
  | 
| USB (для Leonardo, Micro и Due плат) | 
 В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due. 
  | 
| Клавиатура | 
  | 
| Мышь | 
  | 
| Разное | |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
 - Справочник языка Arduino
 - Arduino
 - Перевод от Сubewriter
 - Проверка:myagkij
 - Оформление:myagkij
 - Редактирование:myagkij
 - Страницы, где используется шаблон "Навигационная таблица/Телепорт"
 - Страницы с телепортом
 - Побитовые операторы языка Arduino
 - Побитовый оператор