
それぞれ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
としたいのですが、場合わけをせずに求める
よい方法はないでしょうか。
No.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);
}
}
ソースまで下さってありがとうございますm(_ _;)m
#4さんにはperlの方の質問でも過去に何度かお世話に
なっているので、感謝感謝です。
またよろしくお願いします。
No.3
- 回答日時:
こんにちは。
。>反転してしまうとは、例えば 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 …
>00000000 00000000 11111111 00000000
>となってほしかったのですが、
>11111111 11111111 11111111 00000000
>となってしまいます。
>でしょうか
おっしゃるとおりです^^;
ご迷惑おかけします。
こちらの方法も#2 さんと同じでマスクするということですよね。
Cのようにunsigned が使えると便利だなぁと思う今日この頃です。
ありがとうございました。
No.1
- 回答日時:
通りすがりの主婦です。
すごく勘違いしていたらすみません。なぜ補数で反転してしまうのかが良く分からないのですが、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の数を間違っていました・・
今思うと、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 関数とはどのクラスにあるのでしょうか.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
6桁の数字を重複なしでランダム...
-
Java 初心者 int型の取り扱い方
-
「配列定数は、イニシャライザ...
-
javaでカレンダー作成
-
C# Form処理
-
メインが含まれていません
-
複数のボタンを配置し、それぞ...
-
コード中の謎のエラー
-
sin曲線とcos曲線を描くプログ...
-
関数の引数に、stringやintなど...
-
C#2005 Imagelistの余白の除去...
-
JSPやサーブレットでSystem.out...
-
System.err. printlnとSystem.o...
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
javaです。 途中まで出来ている...
-
動的配列が存在(要素が有る)か...
-
C言語のポインターに関する警告
-
StrutsでJSPからListを受け取り...
-
この警告はどうすれば?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
Java 初心者 int型の取り扱い方
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
Java 日付の加算がうまくいき...
-
JAVA エラー 式の開始が不正で...
-
6桁の数字を重複なしでランダム...
-
コンパイルできません
-
SwingでJtableのヘッダ行が表示...
-
C#で実行時にメソッドの返り値...
-
intが負の時に投げる例外はあり...
-
意味がわかりません
-
コンパイラが注意してくる
-
複数のボタンを配置し、それぞ...
-
Threadに関するの質問
-
C#でバブルソート
おすすめ情報