2016-08-13 10 views
0

я испытываю некоторую странную неподписанную правильную операцию сдвига производить неправильные результаты при попытке выполнить их жестко закодированные и не жестко закодированные данные на 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 

Как решить эту проблему?

+0

«неподписанная сдвиг вправо» в Java является немного неправильным. Сдвинутое значение по-прежнему подписывается, но бит знака смещается и заменяется на ноль. Таким образом, имеет значение, если вы меняете 'byte' против' int', так как бит знака находится в другом месте. – davmac

ответ

0

В случае повернутого байта вы выполняете операцию по типу байта. В случае signRemoved вы выполняете операцию над типом int, и после выполнения операции вы передаете ее в байт. Поэтому результат отличается.

int i = 0xBF; // this is int and the value is 191 
byte b = (byte) 0xBF; // this is byte and value is -65 

int i2 = (i >>> 1) //here the operation is done on int result is 95 
byte b2 = (byte) i2 // result stays 95 

int i3 = b >>> 1 // here b is first promoted to int (-65) then after right shift it becomes 2147483615 
byte b3 = (byte) i3 // -33 
+0

Как получить 0xBF от байтового типа до 0x5F в виде байтового типа без использования целого числа? – thotheolh

+0

При использовании операторов сдвига байты всегда сначала преобразуются в int, так как операторы переключения работают с ints в java. Это объясняет это хорошо http://stackoverflow.com/questions/3948220/behaviour-of-unsigned-right-shift-applied-to-byte-variable –