开发者社区> 问答> 正文

DataOutputSteam的writeInt为什么要这么实现呢?

看thingking in java的IO部分时提到了DataOutputSteam, 于是查看了一下源码, 发现DataOutputStream在实现writeLong, writeInt ,writeChar和writeShort都采用了这种方法实现:

public final void writeChar(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

public final void writeInt(int v) throws IOException {
    out.write((v >>> 24) & 0xFF);
    out.write((v >>> 16) & 0xFF);
    out.write((v >>>  8) & 0xFF);
    out.write((v >>>  0) & 0xFF);
    incCount(4);
}

public final void writeLong(long v) throws IOException {
    writeBuffer[0] = (byte)(v >>> 56);
    writeBuffer[1] = (byte)(v >>> 48);
    writeBuffer[2] = (byte)(v >>> 40);
    writeBuffer[3] = (byte)(v >>> 32);
    writeBuffer[4] = (byte)(v >>> 24);
    writeBuffer[5] = (byte)(v >>> 16);
    writeBuffer[6] = (byte)(v >>>  8);
    writeBuffer[7] = (byte)(v >>>  0);
    out.write(writeBuffer, 0, 8);
    incCount(8);
}

我想知道的是为什么要先无符号右移,然后和00ff进行与运算呢?

展开
收起
蛮大人123 2016-03-10 17:55:06 2260 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    首先 >>> 是无符号右移,右移过程中左侧只填充 0 ,和符号位无关。
    这里代码这样写,应该是为了保障代码的可读性,表示实际写入的是右移后的其中八位。在 write 方法中,已经保障了只写入低八位,所以这段 & 0xFF 的运算和用 >>> 还是 >> 其实是无关紧要的。不过就像复杂的表达式即使没有必要使用括号,也最好使用括号的道理一样,这里应该是为了方便阅读者不误解实际操作的意义。

    2019-07-17 18:58:04
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载