битовое смещение не работает должным образом для коротких значений - PullRequest
0 голосов
/ 26 мая 2019

У меня небольшая проблема с короткими значениями битового смещения:

System.out.println(Integer.toBinaryString(0b1100010001000100 >>> 12); // works correctly, output: 1100
System.out.println(Integer.toBinaryString( 0xFFFF & (short)(0b1100010001000100) >>> 12)) // does not work correctly, output: 1111111111111100

В чем проблема и как я могу ее решить?

1 Ответ

2 голосов
/ 26 мая 2019

Чтобы было ясно, 0xFFFF & (short)(0b1100010001000100) >>> 12 означает 0xFFFF & ((short)(0b1100010001000100) >>> 12). Таким образом, побитовое И является последним после сдвига.

Существует правило, согласно которому short преобразуется в int перед сдвигом (и большинством других операций), так что short сначала расширяется до int, более начальные появляются, потому что значение отрицательно. Если между этим неявным преобразованием и сдвигом происходит побитовое И, то лишние будут удалены:

(0xFFFF & (short)(0b1100010001000100)) >>> 12
...