byte b = -1; // b = -1 1111_1111
b <<= 1; // b = -2 1111_1110
b >>>= 1; // b = -1 1111_1111
В комментариях - значение b в debug.
В последней строке b должно стать 0111_1111, ведь применялся беззнаковый сдвиг вправо. В чем ошибка?
Ответ
"Ошибка" в спецификации Java. Все операции с целыми числами выполняются с 32-битной точностью, и их результатом является int (кроме случаев, когда один из операндов - long).
Код
b >>>= 1;
эквивалентен
b = (byte)( b >>> 1 );
Оператор сдвига выполняет unary numeric promotion для каждого аргумента, приводя их типы к int (или к long). Расширение byte до int сохраняет значение, т.е. (byte)-2 становится (int)-2, отсюда и появляется единица слева в результате сдвига.
Для получения нужного результата можно написать так:
b = (byte)((b & 0xFF) >>> 1);
Комментариев нет:
Отправить комментарий