В C++ есть два оператора побитового сдвига: оператор сдвига влево << и оператор сдвига вправо >>. Эти операторы заставляют биты левого операнда сдвинуться влево или вправо на то количество позиций, которое указано во втором операнде.
Подробнее о двоичной математике см. здесь.
int a = 5; // в двоичной системе: 0000000000000101
int b = a << 3; // в двоичной системе: 0000000000101000, или 40 в десятичной
int c = b >> 3; // в двоичной системе: 0000000000000101, или снова 5, как было изначально
Следует иметь ввиду, что при сдвиге значения x на y бит (x<
int a = 5; // в двоичной системе: 0000000000000101
int b = a << 14; // в двоичной системе: 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
...
Если вы сдвигаете x вправо на y бит (x>>y) и при этом старшим битом x является 1, то результат такой операции будеть зависеть от типа переменной x. Как уже отмечалось ранее, в переменных типа int старший бит является знаковым битом, определяющим является ли число положительным или отрицательным. Если переменная x имеет тип int, то при сдвиге x вправо знаковый бит копируется в младшие биты (по историческим причинам):
int x = -16; // в двоичной системе: 1111111111110000
int y = x >> 3; // в двоичной системе: 1111111111111110
Такое поведение называется расширением знака и, как правило, нежелательно: вместо единиц пользователь чаще ожидает увидеть нули в левой части x на месте свдинутых бит. В то же время для беззнаковых целых чисел (переменные типа unsigned int) действуют другие правила сдвига вправо. Поэтому для предотвращения копирования единиц в старших разрядах сдвигаемой переменной x, можно прибегнуть к преобразованию типов:
int x = -16; // в двоичной системе: 1111111111110000
int y = (unsigned int)x >> 3; // в двоичной системе: 0001111111111110
Таким образом, если предотвращать эффект расширения знака, оператор сдвига вправо >> можно использовать для деления числа на степени 2. Например:
int x = 1000;
int y = x >> 3; // целочисленное деление 1000 на 8, в результате которого y = 125.
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.