当前位置: 首页 > news >正文

java中右移>>和无符号右移>>>的区别

public static void main(String[] args) {byte[] dest = new byte[2];dest[0] = 0x15; //0001 0101dest[1] = (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1,正确System.out.println((dest[1] >> 4) & 0xff);//右移 我们想要的是0000 1111 十进制结果显示15,但是结果是255,二进制1111 1111System.out.println((dest[1] >>> 4) & 0xff);//无符号右移 我们想要的是0000 1111 十进制结果显示15,但是结果是255,二进制1111 1111System.out.println(((dest[1] & 0xff) >>> 4) & 0xff);//无符号右移 我们想要的是0000 1111 十进制结果显示15,结果也是15 正确}

为什么右移与想要的结果不同,可以先看下《计算机组成与结构 - 数值的编码方式》,在Java,byte的表示的值为-2^7
到 2^7-1,所以超过127整数是其本身减与其相差最小的256的倍数,在这里 251-256 = -5,右移动指定的位数后,左边空出的位用原来的符号位填充,所有第二个输出是错误的。

为什么第三个输出的结果也是不正确的?
首先我们看下改文件编译后的字节码文件:
在这里插入图片描述
通过LineNumberTable对照可以看出,字节码文件的44-59之间是源文件19行的内容

在这里插入图片描述
从48,50,51可以看出,指令的第一个字母都是i,而在字节码指令中,操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i 代表对 int 类型的数据操作,l 代表 long,s 代表 short,b 代表 byte,c 代表 char,f 代表 float,d 代表 double,a 代表 reference
在编译器编译时,都把要操作的类型转为了int类型,0xfb编译后二进制1111 1111 1111 1111 1111 1111 1111 1011,无符号位右移4位,变为 (0000) 1111 1111 1111 1111 1111 1111 1111,&上0xff,结果为1111 1111 十进制为255。
在这里插入图片描述

结论

有符号右移(>>):将二进制数向右移动指定的位数,左边空出的位用原来的符号位填充。例如,对于正数,右移后高位补0;对于负数,右移后低位补1。

无符号右移(>>>):将二进制数向右移动指定的位数,左边空出的位用0填充。无论原数是正数还是负数,右移后高位都补0。

对于byte类型的数据无符号位右移时,编译器会把byte类型强转为int类型,想要获得正确的结果在无符号位移前先&0xff

http://www.lryc.cn/news/123825.html

相关文章:

  • 牛客周赛 Round 7
  • R语言生存分析(机器学习)(1)——GBM(梯度提升机)
  • k8s和docker简单介绍
  • Lua学习记录
  • 三分钟完美解决你的C盘内存过大爆红
  • C++ - equal(比较两个vector元素)
  • 多线程:线程池
  • 9.3.2.2网络原理(传输层TCP)
  • ssm+mybatis无法给带有下划线属性赋值问题
  • 学习笔记-JVM监控平台搭建
  • 使用css实现时间线布局(TimeLine)
  • 深入浅出 栈和队列(附加循环队列、双端队列)
  • 前端基础(二)
  • ORB-SLAM2学习笔记7之System主类和多线程
  • gin的占位符:和通配符*
  • 【量化课程】08_2.深度学习量化策略基础实战
  • 12-数据结构-数组、矩阵、广义表
  • Idea 反编译jar包
  • 【Git】安装以及基本操作
  • Spring创建Bean的过程(2)
  • Linux 终端操作命令(2)内部命令
  • 【Git】大大大问题之syntax error near unexpected token `(‘ 的错误解决办法
  • Flink源码之TaskManager启动流程
  • 加入微软MCPP有什么优势?
  • leetcode做题笔记78子集
  • Skywalking-9.6.0系列之本地源码编译并启动
  • proteus结合keil-arm编译器构建STM32单片机项目进行仿真
  • 第五十三天
  • gorm基本操作
  • 华为OD机试 - 排队游戏(Java JS Python)