Страницы

Поиск по вопросам

вторник, 18 июня 2019 г.

Битовый сдвиг влево

Почему переменная val будет инициализирована значение 1, а не значением 0?
int val = 1 << 32;


Ответ

Согласно документации (JLS 15.19):
If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.
то есть
Если тип левой части после numeric promotion — int [это как раз наш случай], то лишь пять младших бит из правой части будут использованы в качестве размера сдвига. Эффект такой же, как если бы правую часть подвергли операции & с маской 0x1f (0b11111). Таким образом, расстояние сдвига всегда находится в промежутке от 0 до 31, включительно.
Это означает, что сдвиг на 32 бита работает как сдвиг на 0, на 33 как на 1 и т. д.

Комментариев нет:

Отправить комментарий