it-swarm-ja.tech

整数を2バイトのバイナリに分割するにはどうすればよいですか?

与えられた

private int width = 400;
private byte [] data = new byte [2];  

整数の「幅」を2バイトに分割し、data [0]に上位バイトを、data [1]に下位バイトをロードします。

それは400 = 1 1001 0000のバイナリ値であるため、data [0]には0000 0001が含まれ、data [1]には1001 0000が含まれます。

41
Kevin Boyd

単純なビット演算を使用する:

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);

仕組み:

  • & 0xFFは、下位8ビットを除くすべてをマスクします。
  • >> 8は、すべてのビットを8桁右に移動して、最下位の8ビットを破棄します。
  • これらのビット演算はintで機能し、intよりも大きなデータ型であるbyteを返すため、バイトへのキャストが必要です。ゼロ以外のビットはすべてbyteに収まるため、大文字小文字は安全です。詳細については、 Conversions and Promotions を参照してください。

Edit:Taylor L は、この場合>>は機能しますが、このコードをfourバイト(Java an intは32ビットであるため)。その場合、>>>ではなく>>を使用することをお勧めします。 ビット単位およびビットシフト演算子 のJavaチュートリアルを参照してください。

79
Stephan202

2バイトを変換するための最もクリーンなソリューションは

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);

整数を4バイトに変換するには、コードは次のようになります。

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);

>>または>>>がシフトに使用されるかどうかは関係ありません。符号拡張によって作成された1ビットは結果のバイトになりません。

this answer も参照してください。

11
starblue

これは、4バイトのintに必要なことを行う必要があります。下位バイトはオフセット0に保存されることに注意してください。必要に応じてそれらを注文するために、読者に練習として残しておきます。

public static byte[] intToBytes(int x) {
    byte[] bytes = new byte[4];

    for (int i = 0; x != 0; i++, x >>>= 8) {
        bytes[i] = (byte) (x & 0xFF);
    }

    return bytes;
}
4
Taylor Leese

Javaの整数は32ビット(= 4バイト)です。

width&0xffは最初のバイトを提供し、width&0xff00 >> 8は2番目のバイトを提供します。

1
Dmitry
int width = 400;
byte [] data = new byte [2];

data[0] = (byte) ((width & 0xFF00) >> 8);
data[1] = (byte) (width & 0xFF);

for(int b = 0; b < 2; b++) {
    System.out.println("printing byte " + b);
    for(int i = 7; i >= 0; i--) {
        System.out.println(data[b] & 1);
        data[b] = (byte) (data[b] >> 1);
    }
}
0
alltom

HeapByteBufferのソースをご覧になることをお勧めします。すべてのプリミティブデータ型の変換コードがあります。 (実際には、ByteBufferを使用できます;)

0
Peter Lawrey