java中int移位时右操作数取低5位(等价于模32),如x

Java 中对 int 类型执行移位运算时,如果右侧的移位位数超过 32(比如 x 或 <code>x >> 60),不会直接报错或抛异常,而是自动对移位数取模 32。这个行为是 Java 语言规范明确规定的,不是 JVM 实现差异,所有符合规范的运行环境都一致。
移位位数实际只用低 5 位
因为 `int` 是 32 位整数,Java 规定:**移位操作中,右操作数只取其二进制表示的低 5 位**(即 `n & 0x1F`),等价于 `n % 32`。 这意味着: - `x > 35` 等价于 `x >> (35 & 0x1F)` → `35 % 32 = 3`,所以是 `x >> 3` - `x >> 4`为什么是模 32?和硬件设计有关
现代 CPU 的移位指令本身就会对位数做模处理(例如 x86 的 `SHL` 指令对 32 位操作数只看低 5 位)。Java 直接沿用了这一约定,既保证效率,也避免“移出全部位后结果恒为 0”这种无意义行为。 注意:这不是编译期优化,而是**运行期语义**——哪怕写 `x >> Integer.MAX_VALUE`,也会按 `MAX_VALUE & 0x1F == 31` 执行。long 类型对应模 64
`long` 占 64 位,因此它的移位位数取低 6 位(`n & 0x3F`),等价于 `n % 64`: - `1L >> 129` → `129 % 64 = 1` → 实际无符号右移 1 位byte/short/char 移位会先提升为 int
这些小整型参与移位时,会先被**隐式转为 int**,再按 `int` 规则处理(即模 32): - `byte b = 1; b 不复杂但容易忽略Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











