Эквивалент оператора сдвига C++ << в Java?
Оператор сдвига С++ <<
не работает. Например, если вы выполните:
// C++
int a = 1;
cout << (a<<38);
Вы получаете 0. Но в Java вы фактически зацикливаете и получаете допустимое значение 64.
Мне нужно перевести некоторый код на С++ на Java, так что я использую в качестве эквивалента для <<
?
Ответы
Ответ 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