Кто-нибудь может объяснить эту битовую операцию? - PullRequest
0 голосов
/ 21 февраля 2019
Decimal         Binary 

x1 = 105        0110 1001
x2 = -38        1101 1010  

1. (byte) (x>>2) 
2. (byte) (x>>>26)

Я понимаю, что первый сдвиг сместит его два раза вправо и заменит недостающие биты на 1., поэтому сдвиг приведет к: 1111 0110

, но я понятия не имею, почемувторая смена приводит к: 0011 1111 или 63.

Насколько я понимаю, x >> добавляет 1, если x отрицательно, и добавляет 0, если x положительно.>>> добавляет 0 независимо от знака.Так что, если это так, то результат x2 >>> 26 не будет 0000 0000?

1 Ответ

0 голосов
/ 21 февраля 2019

Причина "странного" результата битового сдвига заключается в том, что значения расширены до 32 бит (int) до сдвига.

I.е.-38 здесь не 1101 1010, а 1111 1111 1111 1111 1111 1111 1101 1010.

Что должно объяснить, почему -38 >>> 26 равен 0000 0000 0000 0000 0000 0000 0011 1111 (или 63).

Расширение описано в Спецификации языка Java :

В противном случае, если операнд имеет тип времени компиляции byte, short или char, он преобразуется в значение типа int с помощью расширяющегося примитивного преобразования (§5.1.2).


Если вы хотите выполнить операции сдвига битов над 8-битным (byte) значением, вы можете mask использовать только значениемладшие 8 бит после расширения, но перед сдвигом, как предлагает Федерико:

byte x = -38;
(x & 0xFF) >>> 26;

Это даст ожидаемое значение 0 (хотя я не уверен, имеет ли это смысл, так как любое 8-битное значение будетбыть 0, если вы сдвигаете вправо более чем на 8).

...