【问题标题】:Java readUnsignedShort() explanation [duplicate]Java readUnsignedShort() 解释 [重复]
【发布时间】:2017-10-21 00:41:30
【问题描述】:

有人能解释一下下面的代码sn-p吗?

 methodAttributeLength = (long)dis.readUnsignedShort() << 16 | dis.readUnsignedShort();

我在 java doc 中检查了这个。但我不明白。我知道java.io.DataInputStream.readUnsignedShort() 方法的作用。但问题是&lt;&lt;16 的东西。

【问题讨论】:

标签: java


【解决方案1】:

DataInputStream#readUnsignedShort 返回一个 int 花费 32 位,但 short 类型花费 16 位。

int &lt;&lt; 16 会将低 16 位移动到高 16 位,并将0 填充到低 16 位。例如:

int value = 0b11111111000000001000000011111111;
                              ^---------------     
                int high  = 0b10000000111111110000000000000000;
                // high == value << 16  

在这种情况下,| 运算符将高位和低位连接在一起。例如:

int high  = 0b10000000111111110000000000000000; 
int low   = 0b00000000000000001000000000000001; 
int value = 0b10000000111111111000000000000001;
// value == high | low;  

另一方面,您的协议将int 保存为两个shorts,它们是高short 和低short。上面的代码是从两个shorts中读取int的值。

更多详情您可以查看bitewise operatorsshift operators

【讨论】:

  • 我们不能为此使用readInt(),因为它读取4个字节吗?
  • @Pegusus 是的,readInt 将读取 4 个字节,但 readUnsignedShort 将读取 2 个字节。 readInt 有时会产生负数,但 readUnsignedShort 永远不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2012-08-30
  • 2016-07-29
相关资源
最近更新 更多