dポイントプレゼントキャンペーン実施中!

それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、

byte[0] = 0x01;
byte[1] = 0x01;
ならば、
00000000 00000000 00000001 00000001
で、256 + 1 = 257

byte[0] = 0x02;
byte[1] = 0x10;
ならば、
00000000 00000000 00000010 0000011
で、512+3 = 515
です。byteの値が0~127の場合は

int n = byte[0] << 8
n = n | byte[1]
という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。

byte[0] = 0x01;
byte[1] = 0xFF;

のときは、

00000000 00000000 00000001 11111111
で、256+255 = 511
としたいのですが、場合わけをせずに求める
よい方法はないでしょうか。

A 回答 (4件)

サンプルも作ってみました。


--------------------------
public class Sample {
public static void main(String[] args) {
byte [] bytes = { (byte)0x0FF, 0x01 };
int b4 = 0;
for(byte b : bytes){
int i = 0x0FF & b;
b4 = (b4<<8) + i;
}
System.out.printf("%1$d:%1$X%n",b4);
}
}
    • good
    • 0
この回答へのお礼

ソースまで下さってありがとうございますm(_ _;)m

#4さんにはperlの方の質問でも過去に何度かお世話に
なっているので、感謝感謝です。
またよろしくお願いします。

お礼日時:2005/09/10 13:22

こんにちは。



>反転してしまうとは、例えば byte[0] = 11111111 (ビット) の場合,
>int とのビット演算の際のbyteをintに変換したビット列は
>00000000 00000000 00000000 11111111
>となってほしかったのですが,
>11111111 11111111 11111111 11111111
>となってしまいます。

00000000 00000000 11111111 00000000
となってほしかったのですが、
11111111 11111111 11111111 00000000
となってしまいます。

でしょうか?

byte[0]が最下位バイトなのか、下位2番目のバイトなのか不明ですが、
byteをintにキャストするときに、
& (int)255、もしくは & (int)65535
をつけてはいかがでしょうか?

11111111 11111111 11111111 0000000

00000000 00000000 11111111 1111111
=
00000000 00000000 11111111 0000000

的外れだったらすみません。

参考URL:http://stoc.as.wakwak.ne.jp/java/bit_shift_opera …
    • good
    • 0
この回答へのお礼

>00000000 00000000 11111111 00000000
>となってほしかったのですが、
>11111111 11111111 11111111 00000000
>となってしまいます。
>でしょうか

おっしゃるとおりです^^;
ご迷惑おかけします。

こちらの方法も#2 さんと同じでマスクするということですよね。
Cのようにunsigned が使えると便利だなぁと思う今日この頃です。
ありがとうございました。

お礼日時:2005/09/10 13:16

通りすがりのぷ~です。



int b = 0x0FF & b[0];

というような感じで
自動的にintに変換されるのを使うのではなく、
intに代入する時にマスクをしたらどうでしょうか
そのようにしてから計算すると問題有りません。
    • good
    • 1
この回答へのお礼

ありがとうございます。
マスクすればよかったんですね~。
またよろしくお願いします。

お礼日時:2005/09/10 13:13

通りすがりの主婦です。

すごく勘違いしていたらすみません。なぜ補数で反転してしまうのかが良く分からないのですが、2進数から直接10進数でなく、16進のhex関数とかでクッションを置くのはダメですか?

あと、
>00000000 00000000 00000010 0000011 ←これ
>で、512+3 = 515
>です。

誤:00000000 00000000 00000010 0000011
正:00000000 00000000 00000010 00000011
でいいですか?
ならば、できそうなんですが・・。そんな問題ではない!だったらごめんなさい。(>_<)

この回答への補足

答え忘れてしまいました m(_ _;)m

誤:00000000 00000000 00000010 0000011
正:00000000 00000000 00000010 00000011

おっしゃるとおりです。0の数を間違っていました・・

補足日時:2005/09/10 12:25
    • good
    • 0
この回答へのお礼

今思うと、byte[0] = 0xFF という表記はちょっとおかしいですね。
ごめんなさい。
byte[0]
= 0xFF(符号なしとしてみたときの値 10進なら 255 )
= 11111111(ビット表記)
= -1 (実際の数値) と思ってください.

反転してしまうとは、例えば byte[0] = 11111111 (ビット) の場合,
int とのビット演算の際のbyteをintに変換したビット列は
00000000 00000000 00000000 11111111
となってほしかったのですが,
11111111 11111111 11111111 11111111
となってしまいます。byte[0] = 11111111(ビット) = -1 なので当然といえば当然なのですが・・

ごめんなさ、hex 関数とはどのクラスにあるのでしょうか.

お礼日時:2005/09/10 12:24

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