移位运算,这是一个陌生又熟悉的操作。陌生是指不易理解且不常用,熟悉是指“别人家的开发工程师”在代码中经常使用这种方式进行高低位的截取、哈希计算、乘除法的运算,今天,让我们一起来揭开移位运算的神秘面纱。

Java提供了两种带符号位的移位操作,左移 << 和右移 >>,此外,Java还提供了一种无符号右移操作 >>>。下面我们一起来研究如何正确的使用它们。

带符号位的移位操作规则如下:只有负数右移的时候,高位补1,其他情况的补位,都只补0。

下面以8位二进制的移位进行举例。

  10的补码为00001010,左移一位变成20(00010100),右移一位变成5(00000101)
  5的补码为00000101,左移一位变成10(00001010),右移一位变成2(00000010)
  -99的补码为10011101,左移一位变成58(00111010),右移一位变成-50(11001110)

总结几点注意事项:

  • 左移一位近似于乘以2,右移一位近似于除以2。当十进制的奇数时,由于二进制表示的时候最低位为1,右移的时候最低位被舍弃,故不是精准的除以2。
  • 左移有可能改变数的正负。如果左移一位的时候,符号位和数值最高位不同,则数的正负发生变化。
  • 如果是32位处理器,则移动的位数是一个mod 32的结果,即>>1和>>33是一样的结果,可以理解为在进行移位之前,对要移动的位数先取模运算。

程序验证:
System.out.println(Integer.MAX_VALUE << 1);
输出-2。32位int的最大数为01111111111111111111111111111111,左移一位为11111111111111111111111111111110,表示的十进制数为-2。

System.out.println(Integer.MIN_VALUE << 1);
输出0。32位int的最小数为10000000000000000000000000000000,左移一位为00000000000000000000000000000000,表示的十进制数为0。

无符号位的右移操作规则如下:不管正负数,高位都补0。

总结几点注意事项:

  • 正数移动最大位数的最小值为0,负数移动最大位数的最小值为1。因为正数的符号位为0,负数的符号位为1,当移最大位数后,二进制除了最低位为符号位,其他全是0。

java中的移位操作详解相关推荐

  1. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  2. JAVA中的Random详解

    JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...

  3. java中new关键字详解

    java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...

  4. Java中super关键字详解

    Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...

  5. Java中的byte详解

    Java中的byte详解 介绍 byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数. 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在 ...

  6. Java中Iterator迭代器详解

    目录 一.Java中Iterator迭代器详解 1.为什么需要迭代器 2.迭代器长什么样子 3.如何使用迭代器 使用步骤: 代码演示: 迭代器可以简化为增强型for循环: 4.Iterator与Lis ...

  7. Java 中IO流详解(附实例代码/面试题)

    Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...

  8. 【转载】java中泛型使用详解

    引入 Type接口 Class类 Method类 Field类 ParameterizedType接口 TypeVariable接口 类中定义泛型变量 方法中定义泛型变量 方法中泛型参数和泛型返回值 ...

  9. java 中的vector_详解Java中的Vector

    Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vec ...

最新文章

  1. 获取BT节点信息bittorrent-discovery
  2. repo 修改邮箱地址
  3. redis面试全家桶
  4. (转)SpringBoot系列—Redis使用
  5. 数据的交换输出【杭电-2016】 附题
  6. 【蓝桥官网试题 - 算法提高】change(思维)
  7. 解决:Could not find or load main class org.apache.rocketmq.example.quickstart.Producer
  8. SQL笔记-检索出ID为Int或Long中不连续的第一个点
  9. 衡量失败检测算法的指标
  10. 如何配置filezilla服务端和客户端
  11. C语言源代码编译全过程
  12. 杨校老师课堂之Hadoop环境搭建(一)
  13. ae去闪插件deflicker使用_Ae/Pr视频去闪烁插件REVisionFX DEFlicker v1.7.1 Win大众脸已注册...
  14. windows server 2016 活动目录部署系列(三)加入域且创建域用户
  15. 阿里云centos6.9搭建ngrok服务器
  16. 解决ZeroDivisionError: integer division or modulo by zero问题
  17. 虹膜识别1.opencv3同心圆的提取
  18. 电商翻身受宠社交成大势 2019上市科技股大盘点
  19. 常用日本语1000句+简单用语
  20. OSChina 程序员节乱弹 ——看程序员如何优雅地生活

热门文章

  1. java在excel模块中新增sheet_JAVA分多个sheet写入excel
  2. 学习率(Learning rate)的理解及调整依据
  3. 【项目实训】UE4物件质量设置相关
  4. 广东企业电子申报管理系统——官方软件下载
  5. html空格符nbsp
  6. 戴尔linux u盘启动不了怎么办,u盘启动盘启动不了怎么回事_解决u盘启动盘启动不了的方法...
  7. 【BZOJ4570】 [Scoi2016]妖怪
  8. B.FRIENDit壁虎忍者G2游戏鼠标 台式笔记本外接电竞LOL背光游戏鼠标
  9. Vue 笔记【视频参考尚硅谷】持续更新2022/3/22...
  10. 音质好的蓝牙耳机推荐,分享四款音质不错的蓝牙耳机