>> (сдвиг битов вправо)

Описание

Оператор сдвига вправо >> сдвигает биты левого операнда вправо на количество позиций, заданное правым операндом.

Синтаксис

variable >> number_of_bits;

Параметры

  • variable – допустимые типы данных: любой целочисленный тип (byte, short, int, long, unsigned short…).

  • number_of_bits – положительное число, меньшее разрядности variable. Допустимые типы данных: int.

Пример кода

int a = 40;     // двоичное: 0000000000101000
int b = a >> 3; // двоичное: 0000000000000101, десятичное: 5

Примечания и предупреждения

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

int x = -16;          // двоичное: 1111111111110000
int y = 3;
int result = x >> y;  // двоичное: 1111111111111110, десятичное: -2

Если вы хотите, чтобы слева вдвигались нули, вы можете использовать приведение типа для подавления расширения знака:

int x = -16;                        // двоичное: 1111111111110000
int y = 3;
int result = (unsigned int)x >> y;  // двоичное: 0001111111111110, десятичное: 8190

Расширение знака приводит к тому, что оператор сдвига вправо >> выполняет деление на степени 2 даже для отрицательных чисел. Например:

int x = -1000;
int y = x >> 3; // целочисленное деление -1000 на 8, y = -125.

Но будьте внимательны с округлением отрицательных чисел:

int x = -1001;
int y = x >> 3; // деление сдвигом всегда округляет вниз, y = -126
int z = x / 8;  // оператор деления округляет к нулю, z = -125

Смотрите также