Оператор сдвига вправо >> заставляет биты левого операнда сдвигаться вправо на количество позиций, указанных правым операндом.
variable >> number_of_bits;
variable: Разрешенные типы данных: byte, int, long
number_of_bits: число <= 32. Разрешенные типы данных: int.
int a = 40; // в двоичной: 0000000000101000 int b = a >> 3; // в двоичной: 0000000000000101, или 5 в десятичной
Когда вы сдвигаете x вправо на y бит (x >> y), а старший бит в x равен 1, поведение зависит от точного типа данных x. Если x имеет тип int, старший бит является знаковым битом, определяющим, является ли x отрицательным или нет, как мы обсуждали выше. В этом случае знаковый бит копируется в младшие биты:
int x = -16; // в двоичной: 1111111111110000 int y = 3; int result = x >> y; // в двоичной: 1111111111111110
Такое поведение, называемое расширением знака, часто не соответствует желаемому. Вместо этого вы можете пожелать, чтобы нули были сдвинуты слева. Оказывается, что правильные правила сдвига отличаются для выражений типа unsigned int, поэтому вы можете использовать приведение типов для подавления копий, скопированных слева:
int x = -16; // в двоичной: 1111111111110000 int y = 3; int result = (unsigned int)x >> y; // в двоичной: 0001111111111110
Если вы хотите избежать расширения знака, вы можете использовать оператор смещения вправо >> как способ деления на степени 2. Например:
int x = 1000; int y = x >> 3; // Целочисленное деление 1000 на 8, в результате y = 125.