2

私はそれを表すint3つ(ビッグエンディアン)に変換しようとしています。bytesint

ビット単位およびビットシフトと関係があると確信しています。しかし、私はそれを行う方法がわかりません。

例えば:

int myInt;

// some code

byte b1, b2 , b3; // b1 is most significant, then b2 then b3.

*注: int は 4 バイトであり、3 バイトがオーバーフロー/アンダーフローする可能性があることは承知しています。

4

5 に答える 5

14

最下位バイトを取得するには:

b3 = myInt & 0xFF;

最下位から 2 番目のバイト:

b2 = (myInt >> 8) & 0xFF;

そして、最下位から 3 番目のバイト:

b1 = (myInt >> 16) & 0xFF;

説明:

値と 0xFF (2 進数では 11111111) のビットごとの AND 演算は、その数値の最下位 8 ビット (ビット 0 ~ 7) を返します。数値を右に 8 回シフトすると、ビット 8 から 15 がビット位置 0 から 7 に配置されるため、0xFF と AND 演算すると 2 番目のバイトが返されます。同様に、数値を右に 16 回シフトすると、ビット 16 から 23 がビット位置 0 から 7 に配置されるため、0xFF との AND を取ると 3 番目のバイトが返されます。

于 2008-10-09T02:56:41.337 に答える
4
byte b1 = (myint >> 16) & 0xff;
byte b2 = (myint >> 8) & 0xff;
byte b3 = myint & 0xff;

これがJavaでどのように機能するかはわかりませんが、私はJava開発者ではありません

于 2008-10-09T02:52:47.663 に答える
2

int は 3 バイトに収まりません。ただし、これらの特定のものは次のことを知っていると仮定します。

   byte b1 = (myInt & 0xff);
   myInt >>= 8;
   byte b2 = (myInt & 0xff);
   myInt >>= 8;
   byte b3 = (myInt & 0xff);
于 2008-10-09T02:51:17.573 に答える
2

Javaで

int myInt = 1;
byte b1,b2,b3;
b3 = (byte)(myInt & 0xFF);
b2 = (byte)((myInt >> 8) & 0xFF);
b1 = (byte)((myInt >> 16) & 0xFF);
System.out.println(b1+" "+b2+" "+b3);

出力0 0 1

于 2009-10-30T09:13:18.407 に答える
0

正の整数値の場合、ジェレミーの答えは正しいです。負の値に対して正しい変換が必要な場合は、2 の補数形式 ( https://en.wikipedia.org/wiki/Two%27s_complement ) のため、もう少し複雑です。重要なビット (重要度の低いビット) と「符号」ビットの間のギャップを取り除くのが秘訣です。1 つの簡単な方法は、数の乗算です。

    int myIntMultiplied = myInt * 256;

    byte b1, b2, b3;

    b3 = (byte) ((myIntMultiplied >> 8) & 0xFF);
    b2 = (byte) ((myIntMultiplied >> 16) & 0xFF);
    b1 = (byte) ((myIntMultiplied >> 24) & 0xFF);

これにより、負の値の正しい 2 の補数形式になります。

PS:次の方法でバイナリ表現を確認して比較できます。

Integer.toBinaryString(myInt);
Integer.toBinaryString(myIntMultiplied );
于 2020-04-15T20:45:11.180 に答える