я испытываю некоторую странную неподписанную правильную операцию сдвига производить неправильные результаты при попытке выполнить их жестко закодированные и не жестко закодированные данные на Java 8.сдвига вправо без знака на Подписанном Bytes выпускающих ошибки
Я пытаюсь выполнить беззнаковый сдвиг вправо по подписанному байту 0xBF
. Если я просто назначил подписанный байт переменной и затем использовал переменную для выполнения операции без сдвига вправо, я получаю 0xDF
. Если я жестко закодирую 0xBF в операцию без сдвига вправо, я получаю 0x5F
.
byte originalByte = (byte) 0xBF;
System.out.println("Original Data: " + toHexString(new byte[]{originalByte}));
byte rotatedByte = (byte) (originalByte >>> 1);
System.out.println("Rotated Data: " + toHexString(new byte[]{rotatedByte}));
byte signRemoved = (byte) (0xBF >>> 1);
System.out.println("Sign Removed Data: " + toHexString(new byte[]{signRemoved}));
Выход из вышеуказанного Java-вызова.
Original Data: BF
Rotated Data: DF
Sign Removed Data: 5F
Как решить эту проблему?
«неподписанная сдвиг вправо» в Java является немного неправильным. Сдвинутое значение по-прежнему подписывается, но бит знака смещается и заменяется на ноль. Таким образом, имеет значение, если вы меняете 'byte' против' int', так как бит знака находится в другом месте. – davmac