Побитовый свдиг влево (<<), побитовый сдвиг вправо (>>)

Описание

В C++ есть два оператора побитового сдвига: оператор сдвига влево << и оператор сдвига вправо >>. Эти операторы заставляют биты левого операнда сдвинуться влево или вправо на то количество позиций, которое указано во втором операнде.

Подробнее о двоичной математике см. здесь.

Синтаксис

переменная << количество_бит
переменная >> количество_бит

Параметры

переменная — (byte, int, long)
количество_бит — целое число <= 32

Пример:

Следует иметь ввиду, что при сдвиге значения x на y бит (x<

Если вы уверены, что ни один из битов в сдвигаемом числе не пропадет, то для простоты можно считать, что оператор сдвига << умножает левый операнд на 2 в степени, показателем которой является правый операнд. Например, для получения степеней 2 могут быть использованы следующие выражения:

Если вы сдвигаете x вправо на y бит (x>>y) и при этом старшим битом x является 1,  то результат такой операции будеть зависеть от типа переменной x. Как уже отмечалось ранее, в переменных типа int старший бит является знаковым битом, определяющим является ли число положительным или отрицательным. Если переменная x имеет тип int, то при сдвиге x вправо знаковый бит копируется в младшие биты (по историческим причинам):

Такое поведение называется расширением знака и, как правило, нежелательно: вместо единиц пользователь чаще ожидает увидеть нули в левой части x на месте свдинутых бит. В то же время для беззнаковых целых чисел (переменные типа unsigned int) действуют другие правила сдвига вправо. Поэтому для предотвращения копирования единиц в старших разрядах сдвигаемой переменной x, можно прибегнуть к преобразованию типов:

Таким образом, если предотвращать эффект расширения знака, оператор сдвига вправо >> можно использовать для деления числа на степени 2. Например: