Java移位运算核心是“转补码→移位→转原码”,负数必须先转补码再移位,结果需还原为原码;三种移位符区别在于高位填充方式:<<补0,>>符号延伸,>>>无条件补0。

Java移位运算题在面试中常考,核心不是死记规则,而是理解运算过程分三步:转补码 → 移位 → 转回原码看结果。很多同学卡在负数上,其实是没抓住“计算机只认补码”这个前提。
移位运算必须基于补码进行
- Java所有整数(int、byte等)都是有符号的,存储和运算都用补码
- 正数补码 = 原码 = 反码;负数必须先算出补码,再移位
- 移位后得到的是补码形式的结果,最终输出前要还原成原码(即“结果看原码”)
比如 -7 >> 2:
-
-7原码(8位示意):10000111 - 反码:
11111000(符号位不变,其余取反) - 补码:
11111001(反码+1) - 补码右移2位(高位补1):
11111110 - 这个
11111110是补码 → 反码 = 补码−1 =11111101→ 原码 = 符号位不变、其余取反 =10000010→ 十进制是 -2
三种移位符的区别关键在高位填充
-
<<左移:低位补0,符号位可能被挤走(如-1 << 31变成正数) -
>>有符号右移:正数高位补0,负数高位补1(保持符号) -
>>>无符号右移:无论正负,高位一律补0(负数会变正)
例如 -1 >>> 1(int类型,32位):
-
-1补码是全1:11111111 11111111 11111111 11111111 - 无符号右移1位 → 高位补0:
01111111 11111111 11111111 11111111 - 这是正数,直接转十进制 =
2147483647
快速验证与避坑技巧
- 记住两个恒等式:
x << n等价于x * 2^n(仅当不溢出时成立);x >> n等价于x / 2^n向下取整(对负数也适用,但>>>不满足) -
~x等价于-x - 1,可快速验算(如~5 == -6,~(-3) == 2) - 面试写推导时,不必画满32位,用8位或4位示意即可,但需注明“以补码为准”
- byte/short 在运算前会自动提升为 int,结果也是 int 类型(这点常被忽略)
不复杂但容易忽略
立即学习“Java免费学习笔记(深入)”;


















