2017-08-13 4 views
1

私はシフトについてのthisのトピックを読んでいます。なぜシフトを伴う2バイトの変換がインコーレントであるのですか?

byte hi = //... 
byte low = //... 

私はちょうど

short s = (short)((hi << 8) | low) 

は、なぜそれが間違っていることを行うことができない理由:私は2つのバイトを持っている場合と思いましたか?私は8ビット左シフトが最も重要であり、最下位バイトはそのまま残していると思った。そして、ちょうどビットごとにまたはそれら。

+0

をあなたがそのようなのためのByteBufferを使用する必要があります。ByteBuffer.wrap(valBytes).ORDER(ByteOrder.LITTLE_ENDIAN).getShort(); –

+0

@FadySaad私はByteBufferを知っています。私はビットシフト操作を理解することに興味があります。ちょうどそれ:) –

答えて

2

これは、バイトが符号付きであり、計算を行うためにintに拡張されるため、間違った結果をもたらします。ですから、例えば

hi = (byte)0x01; 
low = (byte)0x80; 

のために取る、あなたは計算:

0x00000100 | 0xffffff80 -> 0xffffff80 

望ましい結果ではないとします。

あなたは、代わりにこのようにそれを書くことができます:

short s = (short)((hi << 8) | (low & 0xff)) 
関連する問題