2016-04-26 13 views
4

2バイトをshortにシフトしようとしています。これらの2バイトは、ポートを表す符号なしのshortを表します。私はこれらのバイトをjavaのshortにシフトする複数の方法を試しました。しかし、私はこれを正しく行うことができません。Javaシフトバイトは予期しない結果を返します

これらは私が試した方法があります。

byte a = 0x17; 
byte b = 0xCC; 

(short)((a << 8) | b); 
(short)(((short)a << 8) | b); 

結果は0xFFCCですが、0x17CCでなければなりません。

答えて

5

Javaで算術演算を行う値は、どちらの型も扱える上位型にキャストされます。両方のオペランドがまだ小さい場合は、intにキャストされます。

bは、最初にintにキャストされ、0xFFFFFFCCになります。左に8ビットシフトされたものでは常にマスク0xFFFFFF00を保持し、結果に影響を与えません。それを短くキャストするだけで、左の16ビットが縮小されます。それを解決するには

、明示的に操作を行う前に0xFFでマスク:

(short)(((a&0xFF)<<8)|(b&0xFF)) 
+0

ありがとうあなた、最終的に動作します! :)これを読んだ後、それは感覚をたくさん作ります。 – Max

0

//あなたがバイトにint型から変換することができないので、これを試してみてください:

short a = 0x17; short b = 0xCC; System.out.println("r = " + String.format("0x%04X", (short)((a << 8) | b)));

//出力:r = 0x17CC

関連する問題