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

Java 中的左移()和右移(<code>>>、>>>)是基于二进制补码表示的位运算,直接操作整数的二进制位,不经过数学乘除,效率高且常用于底层计算、算法优化或状态压缩。
左移
将操作数的二进制位整体向左移动指定数量位,右边空出的位置补 0;左边超出位数的部分被直接舍弃(溢出)。
- 等价于:对正数和无符号数,
n ≈ <code>n × 2ᵏ(但不检查溢出,也不处理负数的数学意义) - 例如:
5 → <code>101₂ → <code>1010₂= 10 - 再如:
-3 → <code>-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。对正数,效果与 >> 相同;对负数,则会变成一个很大的正数(因为符号位被“抹掉”)。
- 例如:
-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 实际执行的是 <code>n = <code>n -
long类型需用L后缀避免默认按 int 处理,例如1L 才能安全左移 33 位 - 优先级低于加减,高于赋值,但低于括号和一元运算符,建议复杂表达式加括号明确意图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











