补0,>>补符号位:>>保持符号,负数高位补1,等价于向下取整除法;>>>忽略符号,一律高位补0,用于纯位操作如取字节、哈希扰动。

Java 中的 >>>(无符号右移)和 >>(有符号右移)都用于将整数的二进制位向右移动,但关键区别在于**高位补什么**:一个补 0,一个补符号位。
有符号右移 >>:保持符号,适合带符号运算
对 int 或 long 类型操作时,>> 会保留原数的符号位(最高位),右移后高位用**原符号位的值**填充。正数补 0,负数补 1。
例如:int a = -8; // 二进制(补码): 11111111 11111111 11111111 11111000a >> 1 → 补 1,结果为 -4(11111111 11111111 11111111 11111100)
这个操作语义上等价于“向下取整的除以 2 的幂”,比如 n >> k ≈ n / (2^k)(对负数是向下取整,如 -7 >> 1 == -4)。
无符号右移 >>>:一律补 0,适合位操作与逻辑处理
>>> 忽略符号位,无论正负,右移后高位**一律补 0**。它把数值当作纯二进制位序列处理,不考虑其符号含义。
例如:int b = -8;b >>> 1 → 补 0,结果为 2147483644(即 01111111 11111111 11111111 11111100)
常见用途包括:
- 提取低位字节(如 (x >>> 24) & 0xFF 取最高字节)
- 实现哈希算法中快速折半或扰动
- 处理 RGB 颜色值、网络字节序转换等纯位场景
注意类型与边界行为
>> 和 >>> 对 byte、short、char 操作时,会先提升为 int 再运算,结果也是 int;long 类型则保持 64 位运算。
右移位数超过类型位宽时,Java 会自动取模:
- int:实际位移量为 count % 32
- long:实际位移量为 count % 64
所以 5 >> 35 等价于 5 >> 3(即 0)。
何时选哪个?一句话判断
想做**数学意义上的整除(保留正负)** → 用 >>
想做**纯粹的位移(把负数也当大正数处理)** → 用 >>>
对 char、short 等无符号感的类型,虽然语言层面没有 unsigned,但若需避免符号扩展干扰,>>> 更安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











