首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.

下面着重来说说&0xff都有哪些应用:

1. 只是为了取得低八位

通常配合移位操作符>>使用

例如:java socket通信中基于长度的成帧方法中,如果发送的信息长度小于65535字节,长度信息的字节

定义为两个字节长度。这时候将两个字节长的长度信息,以Big-Endian的方式写到内存中

out.write((message.length>>8)&0xff);//取高八位写入地址
out.write(message.length&0xff);//取低八位写入高地址中

例如,有个数字 0x1234,如果只想将低8位写入到内存中 0x1234&0xff
0x1234 表示为二进制 0001001000110100

0xff 表示为二进制 11111111

两个数做与操作,显然将0xff补充到16位,就是高位补0

此时0xff 为 0000000011111111

与操作 1&0 =0 1&1 =1 这样 0x1234只能保留低八位的数 0000000000110100 也就是 0x34

2. 保证补码的一致性

我们只关心二进制的机器数而不关注十进制的值,那么byte &0xff只是对其最低8位的复制,通常配合逻辑或 ‘’|’'使用,达到字节的拼接,但不保证其十进制真值不变

public static void main(String[] args) {byte b = -127;//10000001int a =  b;System.out.println(a);a =  b&0xff;System.out.println(a);}//输出结果-127,129

乍一看,b是8位的二进制数,在与上0xff(也就是 11111111),不就是其本身吗,输出在控制台结果为什么是129呢?

首先计算机内的存储都是按照补码存储的,-127补码表示为 1000 0001

int a = b;将byte 类型提升为int时候,b的补码提升为 32位,补码的高位补1,也就是

1111 1111 1111 1111 1111 1111 1000 0001

负数的补码转为原码,符号位不变,其他位取反,在加1,正数的补码,反码都是本身

结果是 1000 0000 0000 0000 0000 0000 0111 1111表示为十进制 也是 -127

也就是 当 byte -> int 能保证十进制数不变,但是有些时候比如文件流转为byte数组时候,

我们不是关心的是十进制数有没有变,而是补码有没有变,这时候需要&上0xff

本例子中,将byte转为int 高24位必将补1,此时补码显然发生变化,在与上0xff,将高24重新置0,

这样能保证补码的一致性,当然由于符号位发生变化,表示的十进制数就会变了

1111 1111 1111 1111 1111 1111 1000 0001 &0000 0000 0000 0000 0000 0000 1111 1111结果是0000 0000 0000 0000 0000 0000 1000 0001

和原来的补码 一致,但是显然符号位变化了,表示的十进制数发生变化,变为129

结论:

java中基本类型从小扩展到大的数据类型时候,正数因为符号位是0,无论如何都是补零扩展,但是负数补零扩展和补符号位扩展完全不同,

负数补符号位扩展,保证十进制数不变

例如 byte>>>int -127自动按照补符号位扩展,在高24位补符号位1,表示的十进制数不变

补零扩展,保证补码的一致性,但是表示的十进制发生变化

例如,本例中byte提升为int,&0xff的操作

参考:byte为什么要&0xff

详解 0xff 的意义及作用相关推荐

  1. 【专题5:硬件设计】 之 【49.运算放大器详解a - 三极管的放大作用和静态工作点】

    嵌入式工程师成长之路 系列文章 总目录 系列文章总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新,欢迎微信扫码关注公众号 承接 ...

  2. php vimrc配置文件,vim技巧:我的 .vimrc 配置文件,详解每一个配置项的作用

    下面是我的 .vimrc 配置文件,每一个配置项都添加了注释说明,详解每一个配置项的作用,以便确认为什么要添加这个配置项. " 使用vim的modeline来设置当前文件的textwidth ...

  3. python super()方法的作用_详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递.uz0免费资源网 今天我们介绍的主角是s ...

  4. java中的静态变量的作用域_详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  5. 详解帧中继工作原理及作用

    详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...

  6. 详解http和https的作用与区别

    PS: https就是http和TCP之间有一层SSL层,这一层的实际作用是防止钓鱼和加密.防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名.另外是加密,加密需要一个密钥交换算法, ...

  7. macd指标在实战应用中效果如何,如何证明MACD指标详解能起到预警的作用

    <MACD指标详解>课程学员:如何判定MACD的实战效果? 同济桥博士:大家好,欢迎来到<MACD指标详解>课堂,我是老桥!因为这门课程也推出有半年多的时间了,我们也来总结一下 ...

  8. JAVA中0xFF代表什么_详解 0xff 的作用

    每次遇到与或位移等运算总会懵圈一次,百度明白了之后就忘了,理解不够深刻,不够明确,工作中也很少写,所以记下 为什么要加上"& 0xFF"? 拆分理解下 0xFF是16进制的 ...

  9. java sleep的意义_java 线程Thread.Sleep详解 Thread.Sleep(0)的作用

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果 ...

最新文章

  1. 反转比特位(文章最后有干货)【转】
  2. Spark 读 Elasticsearch
  3. 单身萌妹纸手把手教你用产品思维追女生
  4. 《Photoshop修饰与合成专业技法》—第1章利用图层样式改进抠像
  5. OpenCV纹理对象的实时姿态估计
  6. 全局稳定性收敛平衡点为0吗_神经网络的稳定性阐明.pdf
  7. 如何在Hybris Backoffice里给用户维护电话号码
  8. [Spark]PySpark入门学习教程---例子RDD与DataFrame
  9. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
  10. python进阶-Python 进阶用法 (持续更新)
  11. 华为8545m5补全shell_华为hs8145v5 改华为界面和默认超密(一)
  12. 通过深度学习检测疟疾
  13. 结构型设计模式在公司项目中的运用实践
  14. 软件工程学习进度第七周暨暑期学习进度之第七周汇总
  15. 一个空格惹的祸:服务器端接收不到前端采用问号传参方式传过来的值
  16. 什么是WEBserver? 经常使用的WEBserver有哪些?
  17. 华为数通HCIA——网络架构
  18. java开发环境实验总结_20155229 实验一《Java开发环境的熟悉》实验报告
  19. Axure原型工具Axure RP9安装及Licensee
  20. 前端如何还原设计稿?

热门文章

  1. AVMoviePlayer 视频播放器
  2. PID温控实验平台搭建(一)——PID基础知识介绍
  3. mp4视频获取时长、封面图、编码、转码(mpeg4转h264)工具类
  4. List三种遍历方式详解
  5. 发展波折不能阻挡字节跳动的雄心-互联网老店攻略
  6. 嵌入式常问问题和知识
  7. 现在office都要收费吗?
  8. Python二进制方式切分文件并还原
  9. 关于升级到8G内存的那点事,8G内存够用?明确告诉你为何32位win7为何要升级到8G!
  10. 阿里讲师教你如何做淘宝标题关键字优化