Подтвердить что ты не робот

Эквивалент оператора сдвига C++ << в Java?

Оператор сдвига С++ << не работает. Например, если вы выполните:

// C++
int a = 1;
cout << (a<<38);

Вы получаете 0. Но в Java вы фактически зацикливаете и получаете допустимое значение 64.

Мне нужно перевести некоторый код на С++ на Java, так что я использую в качестве эквивалента для <<?

4b9b3361

Ответ 1

Спецификация языка Java:

Если продвинутый тип левого операнда - int, то только пять младшие разряды правого операнда используются в качестве сдвига расстояние. Это как если бы правый операнд подвергался побитового логического оператора И и (§15.22.1) с значением маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазон от 0 до 31 включительно.

Если продвинутый тип левого операнда длинный, то только шесть младших битов правого операнда используются в качестве сдвига расстояние. Это как если бы правый операнд подвергался побитового логического оператора И и (§15.22.1) с значением маски 0x3f (0b111111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазон от 0 до 63 включительно.

Итак, в вашем примере case, (int)(((long)a)<<38) должен работать.

Ответ 2

Если продвинутым типом левого операнда является int, только пять младших битов правого операнда используются как расстояние сдвига. Это как если бы правая операндов подвергались поразрядному логическому оператору И и (§15.22.1) с значение маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазон от 0 до 31 включительно.

Обратитесь к Спецификации Java Language: http://docs.oracle.com/javase/specs/jls/se7/jls7-diffs.pdf