是带符号右移,高位补符号位(正数补0、负数补1);>>>是无符号右移,高位恒补0,结果必为非负数;二者均作用于补码,移位量对32(int)或64(long)取模。

注意:标题中写的是 >,但这是 HTML 实体编码,实际应为 >>(带符号右移)和 >>>(无符号右移)。Java 中没有单个 > 作为位移运算符;> 是关系运算符(大于),与位移无关。以下按 >> 和 >>> 解释。
Java 中的 >> 和 >>> 是两种右移操作,核心区别在于高位补什么:>> 补符号位(保持正负性),>>> 强制补 0(结果恒为非负)。
带符号右移 `>>`:按补码右移,高位补原符号位
- 操作本质:将整数的二进制补码整体向右平移 n 位,丢弃最右边 n 位,最左边补上原来的符号位(即最高位)。
- 正数 → 补 0;负数 → 补 1。
- 数学效果近似“向下取整除以 2ⁿ”,但仅对正数严格等价;负数不等于数学除法。
例如:
-
8 >> 1→00001000→00000100= 4 -
-8 >> 1→-8的 32 位补码是11111111 11111111 11111111 11111000,右移 1 位后高位补 1 →11111111 11111111 11111111 11111100= -4 -
-7 >> 1→ 补码11111111 11111111 11111111 11111001→ 右移补 1 →11111111 11111111 11111111 11111100= -4(不是 -3)
关键细节:
- 移位量对 32(int)或 64(long)取模:
x >> 33等价于x >> 1 - byte/short/char 运算前自动提升为 int,结果也是 int
无符号右移 `>>>`:强制高位补 0,忽略符号
- 操作本质:不管原数正负,一律将补码右移 n 位,左侧空位无条件补 0。
- 结果永远 ≥ 0(因为最高位变 0),适合纯位处理场景(如提取字节、哈希扰动)。
例如:
-
8 >>> 1→ 同>>,得 4 -
-1 >>> 1→-1的补码全为 1(32 个 1),右移 1 位后高位补 0 →01111111 11111111 11111111 11111111= 2147483647 -
-7 >>> 2→ 补码11111111 11111111 11111111 11111001→ 右移 2 位 + 补 0 →00111111 11111111 11111111 11111100= 1073741820
典型用途:
-
hash >>> 16(如 HashMap 中扰动高 16 位到低 16 位) - 从 int 中提取某 8 位:
(value >>> 24) & 0xFF得最高字节 - 网络协议中解析无符号字段
两个易错点必须注意
位移量超范围自动取模
int x = 5; x >> 35实际执行x >> (35 % 32) = x >> 3long y = 5L; y >> 66实际是y >> (66 % 64) = y >> 2运算符优先级比加减还低
a + b >> c等价于(a + b) >> c,不是a + (b >> c)
若本意是后者,必须写成:a + (b >> c)
同理,x 是 <code>x ?❌ 实际是 <code>(x ,正确写法:<code>x
怎么快速判断该用 `>>` 还是 `>>>`
- 用
>>当你处理有符号整数逻辑,比如模拟除法、保持负数语义(如坐标偏移、索引计算) - 用
>>>当你在做位层面操作:提取比特段、构造掩码、哈希混合、处理字节流、需要无符号语义
例如:
if ((flag & (1 → 用 <code>,没问题-
int highByte = (data >>> 24) & 0xFF→ 必须用>>>,否则负数会补 1 导致高位错误 -
int hash = h ^ (h >>> 16)→ 用>>>确保高 16 位能安全“落”到低 16 位参与异或
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











