アプリ版:「スタンプのみでお礼する」機能のリリースについて

byte型の2つの値を組み合わせて、short型の値をつくろうとしているのですが、うまくいきません。
具体的には
0x02 と 0xa1を併せて
(short)0x02a1・・・673にしたいのですが、
new Integer(((byte)0x02)<<8|(byte)(0xa1)).shortValue()
とすると、
-95という結果になってしまいます。
どのように計算すれば良いのでしょうか?

A 回答 (2件)

byte,short変数共にsigned valueとして処理されます。



byte bh=0x02; byte bl=(byte)0xa1; short sx; short sy;
byte bhh,bhl; int ix;

sx = (short)(bh<<8 | bl); ==>
sx = (short) (0x00000200 | 0xffffffa1)
= 0xffa1;

sx = (short)(bh<<8 | 0xff & bl); ==>
sx = (short)(0x00000200 | 0x000000a1)
= 0x02a1;

以上のようになります。
javaには unsigned type dataはありませんので途中計算は特に指定がない場合、sign extended 32bit data等として処理されます。

byte==>short==>intのタイプ変換はコンパイラで自動的に行われるので上記のように明示指定なしでOKです。
(途中の演算は自動的に32bit あるいは 64bitで行われます)
代入時の型変換も shortValue() 指定でなく (short)と指定することでOKです。
その方が見やすいし、無駄な命令は生成されません。
(多分コンパイラでshortValue() function callは無しに最適化されているとは思いますが)

また次の様な演算も参照してください。

ix = bhh<<24 | (0xff & bhl)<<16 | (0xff & bh)<<8 | (0xff & bl);
ix = (sx<<16) +(sy & 0xffff);

演算子の実行優先順位、暗黙のビット、符号拡張等に注意してコーディングして下さい。
優先順位が解りずらい場合は括弧(...)で括ってください。

 

この回答への補足

各byteに0xFFと&演算をすることで目的の結果が得られました。
ありがとうございました。

補足日時:2009/09/27 02:00
    • good
    • 0

希望の数字は、以下のように、すると求まるみたいです。




System.out.println(new Integer(0x02a1).shortValue());

結果

673
    • good
    • 0
この回答へのお礼

ありがとうございます。
byte、shortの演算を行うと自動でintに変換されるのが問題でして、
なんとかなりませんかねぇ。
bit演算はCの方が遙かに楽ですね。

お礼日時:2009/09/27 02:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!