Java byte array type of byte[] interconverts to int type

  • 2020-06-03 06:39:39
  • OfStack

The code is as follows:


public class CommonUtils {
 // High before, low after 
 public static byte[] int2bytes(int num){
 byte[] result = new byte[4];
 result[0] = (byte)((num >>> 24) & 0xff);// instructions 1
 result[1] = (byte)((num >>> 16)& 0xff );
 result[2] = (byte)((num >>> 8) & 0xff );
 result[3] = (byte)((num >>> 0) & 0xff );
 return result;
 }
 
 // High before, low after 
 public static int bytes2int(byte[] bytes){
 int result = 0;
 if(bytes.length == 4){
  int a = (bytes[0] & 0xff) << 24;// instructions 2
  int b = (bytes[1] & 0xff) << 16;
  int c = (bytes[2] & 0xff) << 8;
  int d = (bytes[3] & 0xff);
  result = a | b | c | d;
 }
 return result;
 }
 
 public static void main(String[] args){
 int a = -64;
 System.out.println("-64="+Integer.toBinaryString(-64));
 byte[] bytes = CommonUtils.int2bytes(a);
 for(int i = 0 ; i<4 ; i++){
  System.out.println(bytes[i]);
 }
 a = CommonUtils.bytes2int(bytes);
 System.out.println(a);
 
 }
}

The results are as follows:


-64=11111111111111111111111111000000
-1
-1
-1
-64
-64

Explanation 1:

-64 converted to 2 base code [10 million][00 million][00 million][00 million][00 million][01 million]

Changing the original code to complement is [11111111][11111111][11111111][11111111][111000000], which is the same as the console output. It can be seen that in java, base 2 is expressed in the form of complement

-64 > > > After 24 (unsigned right shift, high order complement 0), it becomes [00000000][00000000][00000000][00000000][00000000][0011111111]

Will step up the results & After 0xff, it is still [00000000][00000000][00000000][00000000][00000000][11111111], because the value of 0xff is [00000000][00000000][00000000][00000000][00111111], so & The aim of 0xff is to keep the lowest 8 bits unchanged and the rest 0 bits

Then, the strong result is converted to byte type, the low position is retained, and the high position is truncated to [11111111]. It can be seen that the previous 0xff is actually unnecessary, and no matter how high the high position is, it will be cut off eventually

So the result [0] to [11111111] = 1

And so on:

result [1] to [11111111] = 1

result [2] to [11111111] = 1

result [3] is [11000000] = - 64

2:

byte[0] is [11111111]. At first, byte[0] will be converted to int type (before displacement operation, byte type will be converted to int type; if positive, the high order complement will be 0; if negative, the high order supplement will be 1). The high order supplement will be [11111111][11111111][11111111][111111][111111][111111]

Will step up the results & After 0xff, it will become [00000000][00000000][00000000][00000000][11111111]

The result will then go up < < 24 (left displacement, low position complement 0), will become [11111111][00000000][00000000][00000000] [00000000] = a

Similarly, b, c and d were obtained

Finally a | b | c | d

[11111111][00000000][00000000][00000000] |

[00000000] [11111111] [00000000] [00000000] | because < < 16 before & 0xff, so the maximum 8 bits of b are guaranteed to be 0

[00000000] [00000000] [11111111] [00000000] | because < < Before eight & 0xff, so the highest 16 bits of c are guaranteed to be 0

[00000000] [00000000] [00000000] [11000000] due & 0xff, so the maximum 24 of d is guaranteed to be 0

=[11111111][11111111][11111111][11000000] = -64

It can be seen that in order to ensure the conversion of byte to int, the complement does not affect the final result of a | b | c | d (set to 0), & 0xff is required

The conversion between short and byte[] and long and byte[] is similar

PS:

1, the int type takes up four bytes, while the byte type takes up only one byte

2, source code: the highest bit is the symbol bit, the rest bits are used to represent the value size

The original code of 2:00000010

Source code of -2:10000010

3. Reverse code: the reverse code of a positive number is the same as the original code; The inverse symbol bit of a negative number remains the same, while the other bits are reversed

The reverse code of 2:00000010

The inverse of -2:11111101

4. Complement: The complement of a positive number is the same as the original; The complement of a negative number is the reverse +1 of the negative number

Complement of 2:00000010

Complement of -2:11111110


Related articles: