• ベストアンサー

byte[2] から int へ。

それぞれ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 としたいのですが、場合わけをせずに求める よい方法はないでしょうか。

  • ytse
  • お礼率71% (88/123)
  • Java
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答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); } }

ytse
質問者

お礼

ソースまで下さってありがとうございますm(_ _;)m #4さんにはperlの方の質問でも過去に何度かお世話に なっているので、感謝感謝です。 またよろしくお願いします。

その他の回答 (3)

  • mitmit
  • ベストアンサー率0% (0/1)
回答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_operate.html
ytse
質問者

お礼

>00000000 00000000 11111111 00000000 >となってほしかったのですが、 >11111111 11111111 11111111 00000000 >となってしまいます。 >でしょうか おっしゃるとおりです^^; ご迷惑おかけします。 こちらの方法も#2 さんと同じでマスクするということですよね。 Cのようにunsigned が使えると便利だなぁと思う今日この頃です。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

通りすがりのぷ~です。 int b = 0x0FF & b[0]; というような感じで 自動的にintに変換されるのを使うのではなく、 intに代入する時にマスクをしたらどうでしょうか そのようにしてから計算すると問題有りません。

ytse
質問者

お礼

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

  • nakano56
  • ベストアンサー率50% (11/22)
回答No.1

通りすがりの主婦です。すごく勘違いしていたらすみません。なぜ補数で反転してしまうのかが良く分からないのですが、2進数から直接10進数でなく、16進のhex関数とかでクッションを置くのはダメですか? あと、 >00000000 00000000 00000010 0000011 ←これ >で、512+3 = 515 >です。 誤:00000000 00000000 00000010 0000011 正:00000000 00000000 00000010 00000011 でいいですか? ならば、できそうなんですが・・。そんな問題ではない!だったらごめんなさい。(>_<)

ytse
質問者

お礼

今思うと、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 関数とはどのクラスにあるのでしょうか.

ytse
質問者

補足

答え忘れてしまいました m(_ _;)m 誤:00000000 00000000 00000010 0000011 正:00000000 00000000 00000010 00000011 おっしゃるとおりです。0の数を間違っていました・・

関連するQ&A

  • byte変数の大小を効率よく比較したい

    2つのbyte変数の比較を行いたいのですが、 byte aaa = 0x00; byte bbb = (byte)0xff; if(aaa > bbb){ 処理 } のようにするとbyteの最上位bitは符号として扱われるため 0xff=-127となってしまい意図した結果が得られません。 unsigned byteなるものがあれば都合がよいのですが、javaではサポートしておらず困っております。 代替案として、 if(aaa&0xff > bbb&0xff) などとして、一度intへ変換後比較すれば可能ですが、int用のメモリ領域を作成しなくてはならず、非効率の気がします。 byte変数の比較で、他に効率のよい方法はりませんでしょうか?

    • ベストアンサー
    • Java
  • Byteについて

    おはようございます。お世話になっています。 基本データ型の値をコンストラクタによってカプセル化する際に、intであれば値をそのまま、longであればLをサフィックスとして付けて記述するのですが、byteはどのようにすれば良いのでしょうか?色々試した結果、キャスト演算子を使って(byte)12のようにするとbyte型として認識してくれました。これ以外に何か数値をbyte型にする方法は有るのでしょうか?よろしくお願いします。

    • ベストアンサー
    • Java
  • おしえてください<(_ _)>

    C言語を学んでいる初心者です。ビット補数演算子という分野で反転させた値にできるそうなんですがint型で整数は7を反転させて10進数で表すと-8になると書いてありました。私が2進数から10進数に直したら+の数になりました。 詳しい方教えてください<(_ _)><(_ _)>

  • ソフ開の問題集について

    こんにちは。さっそくですが質問させていただきます。 日高哲郎氏の著作 「2006秋 ソフトウェア開発技術者 午後問題集」 の第二章アルゴリズム 演習4 BNF についてなのですが、 構文規則で定義される 言語のなかで byte 8ビット 補数表現の整数 short 16ビット 補数表現の整数 char 16ビット 符号なし整数 int 32ビット 補数表現の整数 を扱うのようなのですが <演算子> の定義の中にシフト演算子があり、 '<<' 空いたビットに符号ビットを入れる '<<<' 空いたビットに 0 を入れる とありました。 ----------------------------------------------------- 設問4の(2) の問題文はつぎのようなものでした。 シフト演算子<< は(1)のように除算演算子で置き換え可能である [ (1) については省略させていただきます。] ~中略~ 除算演算子をシフト演算子に置き換え可能なのは 除数および被除数がどのような場合か ----------------------------------------------------- 正解は 除数 2 のべき乗のとき 被除数 char型で32767以下の場合、またはchar型以外のとき なのですが、これはそれぞれの型においての最上位ビットの 扱いからだと思うのですが、 ( char型以外は 2 の補数表現の整数 ) 質問させていただきたいのは本の正解に対する 解説についてなのです。 ----------------------------------------------------- 解説文においては 「・・・符号ビットを意識しないchar型であると 最上位ビットに 1 が入っていると右シフトの結果空いたビットに 0 が入ってしまうため数値としてみた場合、正しい結果が得られない。 ・・・」 とあるのですが、空いたビットに 0 が入れば数値として 正しくなるのではないでしょうか? そしてこの場合、char型の最上位ビットに 1 が入っていると シフトしたら、空いたビットに 1 が入るので数値としては 正しくなくなるのではないでしょうか? 自分の理解に自信が持てないので、このような質問を させていただきましたが、 ご存知のかた、教えていただけないでしょうか? よろしくおねがいします。

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • byte型のマイナスの扱いについて

    COMポートを使用して通信をしようとしています。 制御コマンドを1byte区切りで送信するのですが、byte型で扱う際、-128~-1の扱いが思うようにいきません。 ウェブを検索して符号拡張など検討してみたのですが解決できませんでした。 いろいろやってみましたが、基本的には byte[] byteArray = {0x12,0x20,-0x80}; String str = new String(byteArray,0); BufferedWriter bw; bw.write(str); このようになっています。 0x12や0x20の送信は、信号を調べる機器にて正しく送信されていることが確認できたのですが、-0x80は予期せぬ値になってしまいます。 -0x80では、16進でC0,3Fなどになってしまいます。 二進で先頭に1がたっていることが原因なのでしょうか。。。 int型にしたり、byte型そのままで送ったり、0x40から左にビットシフトして(&ffも忘れずに)代入したりもしたのですが、結果は同じでした。 ご教授宜しくお願いします!

    • ベストアンサー
    • Java
  • VC++ (byte)(col & 0xFF) の意味

    VC++で画像処理のプログラムを作成中です。 ビットマップを読み込み、1ピクセルごとに処理を施すのが目的です。 「デジタル画像処理入門」という本に col = GetPixel(hDC1,i,j); r = (byte)(col & 0xFF); g = (byte)(col/0x100 & 0xFF); b = (byte)(col/0x1000 & 0xFF); というプログラムが載っていました。 ここで、(byte)とはどういう意味なのでしょうか? また、(col & 0xFF)の意味はわかるのですが(col/0x100 & 0xFF)はどういう意味なのでしょうか? 例えば、colの値が0x300(10進数で258)だとすると、 col/0x100=258/256=1 となってしまうと思うのですが。 VC++のヘルプやgoogleで検索してみたのですが、わからなかったので、ここで質問させてもらいました。 お分かりの方、よろしくお願いします。

  • 浮動小数点の問題です。

    10進数+0.375を浮動小数点で記憶させ、その記憶領域のダンプリストを読み取ると、 0.375は16進数で(1)に、 -1は16進数で(2)となる。 答えは(1)は7F00、(2)8600です。 この2つの問題の途中式と解説をお願いします。 バイト型:バイト数は1バイト,負の補数は2の補数で表す 整数型:バイト数は2バイト,負の補数は2の補数で表す 浮動小数点:バイト数は2バイト,符号1ビット,指数部5ビット,仮数部10ビット ビット番号0:符号部.仮数部の符号が入っている.0なら正,1なら負 ビット番号1-5:指数部.負の値を2の補数で表す ビット番号6-15:仮数部.ビット番号6を小数点第1位とする仮数部の小数点以下の絶対値が、正規化された2進数で入っている 正規化とは,仮数部が2進数で0.1以上1.0未満になるよう指数部を増減する操作である

  • シフト演算子について・・・意味がわかりません(T_T)

    左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)

    • ベストアンサー
    • Java
  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java

専門家に質問してみよう