三张图学懂移位运算符——有符号移位?无符号移位?
本专栏由经验丰富的十年Java开发专家编写, 专注于Java基础知识, 既有面向新手的基础知识讲解又适合资深开发者深入学习。共有99个模块, 每个模块仅需支付几块钱即可学习.
作者网名为seaboat, 在工程算法, 人工智能算法, 自然语言处理, 计算机视觉以及架构设计等领域有着深厚的造诣. 熟悉多种编程语言的技术要点, 特别是在Java, Python和C++方面更为精深. 平时热衷于阅读写作, 喜欢运动和绘画, 崇尚技术自由与思想自由. 已出版书籍包括《Tomcat内核设计剖析》, 《图解Java并发》, 《图解数据结构与算法》以及《人工智能原理科普》等.
文章目录
-
- 移位运算符
- 移位语法
- 右移位运算
- 左移位运算
- 无符号右移位运算
移位运算符
移位运算符的功能主要是对指定的整数执行移位操作。该过程包括先将整数转换为二进制形式后再按照预设的方向进行移动。在Java编程语言中提供了三种基本的移位操作:右移、左移以及无符号右移运算符分别对应于>>、<<和>>>这三个符号

移位语法
三种移位操作都属于二元操作,在编程语言中必须有两个操作数参与才能完成计算。这些数据类型均为整型,并包括 byte、short、int 以及 long 类型等基本类型;此外 char 类型也被允许作为操作数之一。在编程语言中,默认情况下支持以下几种移位算子:左移算子 <<、右移算子 >> 和无符号右移到零扩展右移算子 >>>。这些算子的基本用法如下所示:其中第一个操作目标是要进行移动的对象(目标),第二个则是指定移动的具体位数值;例如:3 >> 2 表示将十进制数字3转换为二进制后向右移动两位;同样地,在某些编程语言环境中还可以使用 >>> 算子来进行无符号右移到零扩展的操作以避免符号扩展的问题。

右移位运算
其会将整数转换为二进制形式;随后将其向右移动指定的位数;左侧则采用符号位的值进行填充;右侧超出部分则会被舍弃。
以下述实例为例,在计算机中进行有符号位移操作时会遵循特定规则。具体而言,在计算过程中若将数字7向右移动两位,则左边会采用符号扩展的方式填充两个0,并将右边溢出的两个二进制位会被截断。经过移位操作后得到的结果为1。再考虑-7向右移动一位的情况,在这种情况下左边同样会采用符号扩展的方式填充一个1,并将溢出的最高有效二进制位直接舍弃。经过移位操作后计算结果为-4。


左移位运算
左移位运算符用于将整数向左移动指定数量的位,在此过程中右方会填充零值,而左边超出范围的部分会被截断。
同样地,在考虑二进制运算时


无符号右移位运算
该运算符可使整数以无符号形式实现右移指定位。所谓无符号者即不论原有数值的最高位是否为1都将其置为0,并且超出部分直接舍弃。
以下示例展示了无符号右移操作后的结果分别为 1 和 2147483644。在执行无符号右移两位操作时(即>>2),无论最高有效位的值如何,在左端都会填充零,并且右边超出的部分则被舍弃。而对于执行无符号右移一位操作时(即>>1),左端同样会填充零,并且右边超出的部分也会被舍弃。


