Java 中的移位运算符(Shift Operator)
针对移位(Shift Operator)操作符是最基本的操作符之一,几乎每种编程语言都包含这一操作符。
同时我们对移位运算又会觉得比较陌生和困惑,这是因为移位运算除了在 JDK 底层你会遇到不少,还有就是在各种奇葩的面试题会遇到一些,在实际使用的时候,这个运算其实很难用得上。
因为用得不多,所以在大部分人的面对的代码情况下,根本不会考虑移位运算,所以对移位运算我们大致知道下就可以了,至于如何奇葩的运算,你只知道一些基本概念就行,其实很多时候并不需要你直接用移位运算算出来。
基本概念
针对移位运算,我们需要了解有几个基本概念。
3 个移位运算符
Java 只有 3 个移位运算符, (带符号右移)和
>>>
(无符号右移)。
为什么有 3 个,移位运算不是左就是右,为什么有 3 个?
因为 Java 的整数是有符号的整数,所以针对符号转换 Java 添加了一个无符号右移。
只能用于整数
Java 的移位运算,不能用于浮点数,只能用于整数。
因为 Java 可以处理整数的长度不一样,所以移位运算只会用在 int 上,虽然其他数据类型也可以用,但是都是在转换成 int 后进行计算的。
类型
长度
long
64 位
int
32 位
short
16 位
byte
8 位
char
8 位
整数 2 进制表达
在 Java 的整数 int 表达中,其中有一个位留给了符号位置,所以真正可以存储数据的位为 31 位。
因此,Int 的存储范围为:[-2^31,2^31-1],所以上面的指数为 31, 而不是 32 的原因是其中有一位留给了符号位。