//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の2バイトに対するビット演算がintを返すのはなぜですか?バイトにキャストバックできることはわかっていますが、ばかげているようです。
言語仕様がそう言っているからです。理由はありませんが、これらが最も可能性の高い意図であると思われます。
それが正しく、この精度の低下を引き起こす可能性のある値がない場合、言い換えると、「不可能な精度の低下」コンパイラはシャットダウンする必要があります...そして修正する必要があり、これにキャストを追加しないでください:
byte a = (byte) 0xDE;
byte b = (byte) 0xAD;
byte r = (byte) ( a ^ b);
2バイトにはJavaビット単位の演算はありません。コードは暗黙的かつサイレントにそれらのバイトをより大きな整数型(int
)に変換し、結果もその型になります。 。
ここで、バイトに対するビット演算を未定義のままにしておくことの正気性に疑問を呈するかもしれません。
これは、人々がすでに指摘している同様の質問の1つに対する回答のどこかにありました。
http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx