//key & hash are both byte[]
int leftPos = 0, rightPos = 31;
while(leftPos < 16) {
//possible loss of precision. required: byte, found: int
key[leftPos] = hash[leftPos] ^ hash[rightPos];
leftPos++;
rightPos--;
}
Почему был бы битовая операция на двух байтах в Java возвращать интервал? Я знаю, что мог просто бросить его назад к байту, но это кажется глупым.
Потому что так сказано в спецификации языка. Это не дает никаких оснований, но я подозреваю, что это наиболее вероятные намерения:
На двух байтах нет битовых Java-операций. Ваш код неявно и бесшумно преобразует эти байты в более крупный целочисленный тип (int
), в результате чего получается еще и такой тип.
Теперь вы можете усомниться в разумности оставления битовых операций над байтами неопределенными.
.Это было где-то внизу в ответах на один из похожих вопросов, на которые люди уже указывали:
http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx
Если он корректен и нет значения, которое может привести к такой потере точности, то есть: "невозможная потеря точности" компилятор должен заткнуться... и его нужно исправить, и в этом случае не нужно добавлять кастинг :
byte a = (byte) 0xDE;
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);