如何将整数拆分为2字节二进制?

Kev*_*oyd 43 java

特定

private int width = 400;
private byte [] data = new byte [2];  
Run Code Online (Sandbox Code Playgroud)

我想将整数"width"分成两个字节,并用高字节加载数据[0],用低字节加载数据[1].

这是二进制值400 = 1 1001 0000因此数据[0]应包含0000 0001,数据[1]应包含1001 0000

Ste*_*202 81

使用简单的按位运算:

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • & 0xFF 除最低八位之外的所有掩码.
  • >> 8 通过向右移动所有位8个位置来丢弃最低8位.
  • 转换为字节是必要的,因为这些按位运算在a上运行int并返回a int,这是一个比它更大的数据类型byte.这种情况是安全的,因为所有非零位都适合byte.有关更多信息,请参阅转化和促销.

编辑: Taylor L正确评论虽然>>在这种情况下工作,如果你将这个代码推广到四个字节(因为在Java中int是32位),它可能会产生不正确的结果.在这种情况下,最好使用>>>而不是>>.有关更多信息,请参阅Bitwise和Bit Shift运算符Java教程.

  • >>可能不是你想要的.>>>在移位时不带符号位,因此如果要捕获所有4个字节,在这种情况下使用可能更好. (4认同)

sta*_*lue 11

对于转换两个字节,最干净的解决方案是

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
Run Code Online (Sandbox Code Playgroud)

为了将整数转换为四个字节,代码将是

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);
Run Code Online (Sandbox Code Playgroud)

无论>>或>>>是否用于移位,由符号扩展创建的任何一个位都不会在结果字节中结束.

另见这个答案.