小编典典

如何在Java中使用位移

java

我正在尝试构建IP标头。

IP标头包含以下字段:版本,IHL,DSCP等。我想填充一个字节数组,以便可以将信息存储为字节。

但是让我感到困惑的是,“版本”字段只有4位宽。IHL也只有4位宽。如何将这两个字段的值都拟合为字节?我需要做移位吗?

例如,Version = 4,IHL =5。我需要创建一个字节,该字节等于0100 0101 = 45h或十进制69。


阅读 305

收藏
2020-11-30

共1个答案

小编典典

(byte) (4 << 4) | 5

这会将值4左移,然后将低4位设置为值5。

  1. 00000100值(4
  2. 01000000左移4位(<< 4)后
  3. 00000101另一个值(5
  4. 01000101``|#2和#3 的按位OR()的结果

由于操作数是int类型(即使它们是byte值,即使int操作员喜欢|对它们进行操作,它们也会被提升为类型),因此最终结果需要强制转换存储在中byte

如果byte在任何按位运算中将值用作操作数,则对的隐式转换int会导致意外的结果。如果要将a
byte视为在该转换中未签名,请使用按位AND(&):

byte b = -128; // The byte value 0x80, -128d
int uint8 = b & 0xFF; // The int value 0x00000080, 128d
int i = b; // The int value 0xFFFFFF80, -128d
int uintr = (b & 0xFF) | 0x04; // 0x00000084
int sintr = b | 0x04; // 0xFFFFFF84
2020-11-30