美文网首页
一起来看看Java中的“小剪刀”,位移运算 &0xFF 的深度解

一起来看看Java中的“小剪刀”,位移运算 &0xFF 的深度解

作者: 攻城狮Chova | 来源:发表于2021-09-07 11:58 被阅读0次
Java位移操作

DataOutputStream

  • 位于java.io.FilterOutputStream.DataOutputStream
  • 与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写
  • 任何机器上任何DataInputStream都能够读取这些写入的数据
  • 所有的方法都以write开头.比如writeByte(), writeFloat()

PrintStream

  • 位于java.io.FilterOutputStream.PrintStream
  • 最初的目的是为了以可视化格式打印所有的基本数据类型以及String对象
  • 和DataOutputStream不同的是: PrintStream目的是将数据元素置入 "流" 中,使得DataInputStream能够可移植地重构这些数据元素

二进制写入

字符串写成二进制

  • 字符串本质是char的序列,也就是char[]
  • 只要遍历写入每一个char, 就完成了写一个字符串的功能

char写成二进制

  • 英语字母有ASCII码,可以将每个字符转换成对应的数字
  • Unicode码表: 字符和编码之间的映射,使用2个字节表示所有字符
    • Unicode字符编码标准是固定长度的字符编码方案,包含世界上几乎所有现用语言的字符
  • Unicode根据要编码的数据类型使用两种编码格式:
    • 16位:
      • 默认编码格式为16位.即每个字符是16位(2个字节宽度)
      • 通常显示为U+hhhh. 其中hhhh是字符的16进制代码点
    • 8位
  • Unicode标准提供了一种扩展机制,允许编码一百多万个字符:
    • 使用一对高位和低位代用字符来对扩展字符或补充字符进行编码
    • 第一个高位代用字符: 具有U+D800U+DBFF之间的值
    • 第二个低位代用字符: 具有U+DC00U+DFFF之间的值

writeChar源码

  • 所以每一个char就是一个0-65535之间的数字
  • DataOutputStream.writeChar源码:
public final void writeChar(String s) throws IOException {
    int len = s.length();

    for (int i = 0; i < len; i++) {
        int v = s.charAt(i);
        out.write((v >>> 8) & 0xFF);
        out.write((v >>> 0) & 0xFF);
    }
    incCount(len * 2);
}

writeShort源码

  • writeChar相比 ,writeShort不需要遍历一遍string
  • DataOutputStream.writeShort源码:
public final void writeShort(int v) {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

0xFF

  • 二进制写入的问题:
    • 为什么要用无符号右移?
    • & 0xFF不会使得数的大小改变,为什么还要使用 & 0xFF ?
  • 0xFF是16进制的255,也就是二进制的1111
  • &是AND与操作,同时为1才为1,否则为0

位移运算

  • 左移: <<. 右补0
  • 有符号右移: >>. 左补符号位
    • 如果符号位为1则左补1
    • 如果符号位为0则左补0
  • 无符号右移: >>>. 左补0

二进制写入原理

  • 二进制写入的方式: 先取高8位写入,再写入低8位
  • 示例: 写入的short字符对应的unicode码为3
    • 先得到3的原码的高8位:
      • 0000,0000,0000,0011 >>> 8得到0000,0000,0000,0000
      • 然后再 & 0xFF得到最终结果0000,0000
    • 再得到3的原码的低8位:
      • 0000,0000,0000,0011 >>> 0得到0000,0000,0000,0011
      • 然后再 & 0xFF得到最终结果0000,0011

总结

  • & 0xFF就相当于计算机中的剪刀,当'&'操作符两边数的bit位数相同时不改变数的大小,只是转么截出一个字节8bit的长度
  • 同理 : & 0x0F可以得到4bit的长度

相关文章

  • 一起来看看Java中的“小剪刀”,位移运算 &0xFF 的深度解

    DataOutputStream 位于java.io.FilterOutputStream.DataOutputS...

  • Java中的位移运算

    在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他...

  • 一文搞明白位运算、补码、反码、原码

    在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。 正数位移...

  • 工具方法

    先说明一些用到的小知识,变化过程以代码说明。 左位移<<,右位移>>。 &0XFF操作。 很明显,-10二进制补码...

  • java中的运算符

    内容 算数运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 位移运算符 三元运算符java中的运算符,有以下几...

  • Java中的 &0xFF、~运算符

    java中byte转换成int时,如果我们期望得到的int是允许>=128的无符号数,或者int需要再转换成16进...

  • Java和Javascript中位移运算

    参考:https://www.cnblogs.com/thtlovelife/p/8664404.html ht...

  • java位移运算总结

    (1)计算中负数都是以补码形式进行存储的; (2)计算机中数的运算都是补码方式参与运算; (3)正数的原码、反码、...

  • JS中的位移运算

    快速理解位运算: 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用 位运算只针对整数...

  • Java基础系列之位移

    Java中的位移其实我们很少使用,但是大家一定要明白位移的原理

网友评论

      本文标题:一起来看看Java中的“小剪刀”,位移运算 &0xFF 的深度解

      本文链接:https://www.haomeiwen.com/subject/qmnuwltx.html