2

次のコードは、int を Bytes 配列に変換するものです。intiが 24、16、8 回右にシフトされ、0xFF と ANDED されていることはわかっていますが、これらの数値が使用された理由は理解できません。

private static byte[] intToBytes(int i)
  // split integer i into 4 byte array
  {
    // map the parts of the integer to a byte array
    byte[] integerBs = new byte[4];
    integerBs[0] = (byte) ((i >>> 24) & 0xFF);
    integerBs[1] = (byte) ((i >>> 16) & 0xFF);
    integerBs[2] = (byte) ((i >>> 8) & 0xFF);
    integerBs[3] = (byte) (i & 0xFF);

    // for (int j=0; j < integerBs.length; j++)
    //  System.out.println(" integerBs[ " + j + "]: " + integerBs[j]);

    return integerBs;
  }  // end of intToBytes()
4

4 に答える 4

0

は 4 バイトで構成されているため、8 ビットの倍数 = 1 バイトをシフトすることintで、 のすべてのバイトに「到達」できます。int

最初のバイトを取得するにはint、24 ビット = 3 バイトシフトし、2 番目のバイトは 16 ビット = 2 バイトシフトするなど...

マスキング& 0xFFはオーバーフローを防ぐ目的を果たすため、必要なバイトのみを取得します。

それを視覚化するために

31                              0  
 |                              |
 11111111111111111111111111111111

右に 24 シフトします。

 31                             0
 |                              |
 00000000000000000000000011111111

を使用してマスキングすると& 0xFF、0 から 7 までの 8 ビットが得られます。

于 2013-04-18T06:31:55.980 に答える
0

32 ビット整数は、次の 4 バイトで構成されます。

  • バイト 0 はビット 0 から始まります。
  • バイト 1 はビット 8 から始まります。
  • バイト 2 はビット 16 から始まります。
  • バイト 3 はビット 24 から始まります。

これで、8、16、および 24 がどこから来たのかを説明できれば幸いです (これらは 8 の倍数であり、1 バイトの幅をビット単位で表したものです)。

最後に、注目に値するのは

integerBs[3] = (byte) (i & 0xFF);

と同じです

integerBs[2] = (byte) ((i >>> 0) & 0xFF);

これがミッシングゼロです。

于 2013-04-18T06:31:50.403 に答える