浅谈 &0xFF操作

浅谈 &0xFF操作在java.io.FilterOutputStream.DataOutputStream:与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写。这样一来,任何机器上任何DataInputStream都能够读取它们。所有方法都以“write”开头,例如writeByte(),writeFloat()等。java.io.FilterOutputStream.PrintSt

大家好,又见面了,我是你们的朋友全栈君。

本文章为博主原创文章,未经授权,不得转载。

在java.io.FilterOutputStream.DataOutputStream:与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写。这样一来,任何机器上任何DataInputStream都能够读取它们。所有方法都以“write”开头,例如writeByte(),writeFloat()等。 

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

对于如何把一串字符串写成二进制,我一直迷惑不解,直到我看到下面的信息:

字符串的本质是char的序列,也就是char [ ]。因此,遍历写入每一个char,就完成了写一个字符串的功能!

那么问题又来了,如何把char写成二进制呢?

英语字母有ASCII码,可以把每个字符转换成对应的数字,那么汉字呢,日语呢,韩语呢,泰国语呢????????????????????????????????????????????????????

把心放肚子里吧,这个问题前人早就已经解决了。世界上的绝大部分字符都有一张类似于ASCII码表的字符和编码间的映射,那就是Unicode码表。看:

Unicode 字符编码标准是固定长度的字符编码方案,它包含了世界上几乎所有现用语言的字符。有关 Unicode 的信息可在最新版本的 The Unicode Standard 一书中找到,并可从 Unicode 协会 Web 站点(www.unicode.org)中找到。 Unicode 根据要编码的数据类型使用两种编码格式:8 位和 16 位。缺省编码格式是 16 位,即每个字符是 16 位(两个字节)宽,并且通常显示为 U+hhhh,其中 hhhh 是字符的十六进制代码点。虽然生成的 65000 多个代码元素足以用于 编码世界上主要语言的大多数字符,但 Unicode 标准还提供了一种扩展机制,允许编码一百多万个字符。扩展机制使用一对高位和低位代用字符来对扩展字符或补充字符进行编码。第一个(或高位)代用字符具有 U+D800 和 U+DBFF 之间的代码值,而第二个(或低位)代用字符具有 U+DC00 和 U+DFFF 之间的代码值。

unicode码真的可以用2个字节表示世界上的绝大部分字符。

至此,当看到一个char时,我仿佛看到了它背后隐隐欲现的0-65535间的数字,当看到一个String时,我仿佛看到了一串数字!

所以,DataOutputStream.writeChars(str)的源码也就明晰了

public final void writeChars(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);
    }

所以除了要遍历一遍string之外,其他的操作Yu DataOutputStream.writeShort(v)的源码没什么区别

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

至此,就把一串字符串写成二进制了。

但是,你有没有一个疑问????????为什么(v >>> 8) & 0xFF ??为什么(v >>> 0) & 0xFF????不知道你有没有,反正我有。

具体疑问:1 为什么要用无符号的右移? 2 &0xFF不会使数的大小改变,为什么还要 &0xFF?

先科普一下:

0(零)xFF是16进制的255,也就是二进制的 1111,1111

& AND 按位与操作,同时为1时才是1,否则为0.

————位移运算计算机中存的都是数的补码,所以位移运算都是对补码而言的————

<< 左移 右补0

>> 有符号右移 左补符号位,即:如果符号位是1 就左补1,如果符号位是0 就左补0

>>>无符号右移 ,顾名思义,统一左补0

————————————————————————————————————————

要想知道为什么?我们应该想想,我们的目的是干什么的?开始已经讲了:先取高8位写入,再写入低8位.。

0000,0000,0000,0011     3的二进制原码,假设要写入的short字符对应的unicode码是3。

0000,0000,0000,0000      这是”>>>8″的结果                        

                  1111,1111       然后再 &0XFF                                                                         

                 0000,0000       最终结果                                                                                    

   这就得到了 3的原码0000,0000,0000,0011 的高8位。

    0000,0000,0000,0011        >>>0还是源码本身不变

                       1111,1111        &0XFF                                                                       

                      0000,0011        最终结果
这就得到了 3的原码0000,0000,0000,0011 的低8位。

其实,用有符号的右移>>也一样得到高/低8位,因为右移操作不改变数本身,返回一个新值,就像String。所以 “&0xFF” 就像计算机中的一把剪刀,当‘&’操作符两边数的bit位数相同时不改变数的大小,只是专门截出一个字节的长度。同理,&0x0F呢?得到4bits

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150768.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月19日 下午8:16
下一篇 2022年6月19日 下午8:16


相关推荐

  • phpstorm 激活码生成(破解版激活)

    phpstorm 激活码生成(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    125
  • clion激活码2021.4_通用破解码

    clion激活码2021.4_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    258
  • prototype.js学习(1)

    prototype.js学习(1) 1、关于javascript的apply和call函数prototype.js中用了大量的apply和call函数,不注意会造成理解偏差。官方解释:应用某一对象的一个方法,用另一个对象替换当前对象。apply与call的区别是第二个参数不同。apply是 数组或者arguments对象。而call是逗号隔开的任何类型。apply,call方法最让人混淆的地方也是apply,call的

    2022年7月22日
    13
  • grid布局浏览器兼容_Grid布局

    grid布局浏览器兼容_Grid布局grid 布局是一种新的布局方案 传统布局使用浮动和定位 而 grid 布局可以像表格一样将页面容器分割成一块一块的区域 定义子元素的排布和位置 可以说是 flex 布局的升级版 借用大神旭哥的话 Grid 布局就像是 分田种地 故事是这样的 张老板是个程序员 省吃俭用攒了点小钱 然后老家因为城镇化建设 农村都没什么人 土地都荒废在那里 于是就承包了一块地 打算养养鱼 种种果树 承包的地方很挺大 如何划分土

    2026年3月26日
    2
  • jQuery实现方式不一样的跳转到底部

    jQuery跳转到页面底部效果在线体验:http://hovertree.com/texiao/jquery/9.htm以下是完整HTML代码:跳到底部jquery效果-何问起跳到底部效果

    2021年12月21日
    52
  • 现代的新语言–Swift初探

    现代的新语言–Swift初探

    2021年12月1日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号