请解释为什么24,16,8用于将int转换为字节?

Lai*_*lot 3 java byte integer

以下代码是将int转换为Bytes数组.我知道int i右移24,16,8次,ANDED用0xFF但是我无法理解的是为什么使用这些数字?

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()
Run Code Online (Sandbox Code Playgroud)

133*_*day 8

好吧,假装你有一个32位的二进制数:

00001111 00000111 00000011 00000001
Run Code Online (Sandbox Code Playgroud)

一个字节相当于8位,因此上面的数字由4个字节组成.

为了将这些字节分开,我们需要执行一系列移位和掩码操作.

例如,要获取第一个字节,(00001111)我们执行以下操作:

00001111 00000111 00000011 00000001 (original)
00000000 00000000 00000000 00001111 (shifted 24 spaces to the right)
Run Code Online (Sandbox Code Playgroud)

现在我们不希望这3个字节的零位于前面,所以我们使用8位掩码(0xFF)AND32 bit结果数和掩码之间执行操作.

例如:

00000000 00000000 00000000 00001111
&&                         11111111
-----------------------------------
                           00001111 (the first byte)
Run Code Online (Sandbox Code Playgroud)

现在你可以想象如何获得第二个字节(只向右移16位).整个目的是在前8个位置获得你想要的8位并使用掩码来摆脱前方的垃圾.