>> (сдвиг битов вправо)
Описание
Оператор сдвига вправо >> сдвигает биты левого операнда вправо на количество позиций, заданное правым операндом.
Синтаксис
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