Java 请给我解释一下为什么24,16,8用于将int转换成字节?

Java 请给我解释一下为什么24,16,8用于将int转换成字节?,java,integer,byte,Java,Integer,Byte,下面的代码将int转换为Bytes数组。 我知道intI右移了24、16、8次,并与0xFF进行and运算,但我不明白的是为什么要使用这些数字 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]; int

下面的代码将int转换为Bytes数组。 我知道int
I
右移了24、16、8次,并与0xFF进行and运算,但我不明白的是为什么要使用这些数字

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()
专用静态字节[]intToBytes(inti)
//将整数i拆分为4字节数组
{
//将整数部分映射到字节数组
byte[]integerBs=新字节[4];
整数b[0]=(字节)((i>>>24)和0xFF);
integerBs[1]=(字节)((i>>>16)和0xFF);
整数b[2]=(字节)((i>>>8)和0xFF);
integerBs[3]=(字节)(i&0xFF);
//对于(int j=0;j
32位整数由四个字节组成:

  • 字节0从第0位开始
  • 字节1从第8位开始
  • 字节2从第16位开始
  • 字节3从第24位开始
我希望这能解释8、16和24的来源(它们是8的倍数,即字节的宽度,以位为单位)

最后,值得注意的是

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

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

这是缺少的零。

由于
int
由四个字节组成,您可以通过移位8位的倍数=1字节来“到达”int中的每个字节

为了获得第一个字节,将
int
移位24位=3字节,将第二个字节移位16位=2字节,依此类推

屏蔽
&0xFF
用于防止溢出,因此您只获取所需的字节

想象一下

31                              0  
 |                              |
 11111111111111111111111111111111
右移24等于

 31                             0
 |                              |
 00000000000000000000000011111111

使用
&0xFF
掩蔽它可以得到0到7之间的8位

Ok让我们假设您有一个32位二进制数:

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

要分离出这些字节,我们需要执行一系列移位和掩码操作

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

00001111 00000111 00000011 00000001 (original)
00000000 00000000 00000000 00001111 (shifted 24 spaces to the right)
现在,我们不希望这3个字节的零出现在前面,因此我们使用一个8位掩码
(0xFF)
,并在我们的
32位
结果数字和掩码之间执行
操作

例如:

00000000 00000000 00000000 00001111
&&                         11111111
-----------------------------------
                           00001111 (the first byte)
现在您可以想象如何获得第二个字节(仅向右移动16位)。其全部目的是在前8个位置获得所需的8位,并使用掩码清除前面的垃圾。

一些整数:

1111100101010101010011001001001010010101010011010

右移24位:

11111001010

与0xFF进行AND运算:

11111001010

0000 1111111 1111


0000 1001 1010

…这只是第4个字节

整数:

1111100101010101010011001001001010010101010011010

右移16位:

1111100101010011010

与0xFF进行AND运算:

1111100101010011010

0000 0000 1111111 1111


0000 0000 1001 1010

…这只是第3个字节


等等。

整数是4字节,字节是8位。该函数忽略数字的“endianness”,这可能会导致数组中出现垃圾。将整数视为十六进制数可能会有所帮助。您也可以在此处找到一个很好的解释: