Java位移运算符包括左移<<、算术右移>>和逻辑右移>>>,分别实现高效二进制位操作:<<高位补0;>>高位补符号位,保持符号;>>>高位强制补0,负数变正数;仅适用于整数类型,右操作数对位数取模。

Java 中的左移(<<)和右移(>>、>>>)是基于二进制补码表示的位运算,直接操作整数的二进制位,不经过数学乘除,效率高且常用于底层计算、算法优化或状态压缩。
左移
将操作数的二进制位整体向左移动指定数量位,右边空出的位置补 0;左边超出位数的部分被直接舍弃(溢出)。
- 等价于:对正数和无符号数,
n << k≈n × 2ᵏ(但不检查溢出,也不处理负数的数学意义) - 例如:
5 << 1→101₂ << 1→1010₂= 10 - 再如:
-3 << 2→-3在 int 中是11111111 11111111 11111111 11111101,左移 2 位后高位截断,结果为11111111 11111111 11111111 11110100,即 -12
算术右移 >>:高位补符号位,保持符号
将二进制位整体向右移动,左边空出的位置用原数的符号位(最高位)填充,因此负数右移后仍为负数,正数仍为正数。
- 对非负数,
n >> k等价于n ÷ 2ᵏ向下取整(即 floor 除法) - 例如:
10 >> 1→1010₂ >> 1→0101₂= 5 - 例如:
-8 >> 2→-8的补码右移 2 位,符号位(1)不断填充,结果为 -2
逻辑右移 >>>:高位强制补 0,无符号右移
不管原数正负,右移后左边空位一律补 0。对正数,效果与 >> 相同;对负数,则会变成一个很大的正数(因为符号位被“抹掉”)。
立即学习“Java免费学习笔记(深入)”;
- 例如:
-1 >>> 1→-1的 int 补码是全 1(32 个 1),右移 1 位并补 0 → 得到01111111 11111111 11111111 11111111= 2147483647(即Integer.MAX_VALUE) - 常用于提取无符号字节、处理网络字节序、或需要把负数当作纯位模式对待的场景
使用注意点
位移运算符只对整数类型(byte、short、int、long)有效;char 也可用但会被提升为 int;浮点型不支持。
- 右操作数(位移量)会自动对位数取模:如
int是 32 位,n << 35实际执行的是n << (35 % 32)=n << 3 -
long类型需用L后缀避免默认按 int 处理,例如1L << 33才能安全左移 33 位 - 优先级低于加减,高于赋值,但低于括号和一元运算符,建议复杂表达式加括号明确意图


















