在Java里,整数类型都是以二进制补码形式存储的。位移运算符直接对二进制位进行操作,主要包括左移<<、带符号右移>>以及无符号右移>>>。本文重点说明左移与无符号右移>>>的用法和差异。

左移运算符 <<
左移运算符将操作数的二进制位全部向左挪动指定位数,低位补0。每左移1位,数值大约变成原来的2倍(在不溢出时)。
public class LeftShiftDemo {
public static void main(String[] args) {
int a = 5; // 二进制 0000...0101
int b = a << 2; // 左移2位,变成 0000...010100,即20
System.out.println(b); // 输出 20
}
}
无符号右移运算符 >>>
无符号右移>>>把二进制位向右挪动,无论原数是正是负,左边空出的高位都补0。这和带符号右移>>不同,>>会在左边补符号位。
public class UnsignedRightShiftDemo {
public static void main(String[] args) {
int negative = -8; // 补码形式,最高位为1
int result = negative >>> 2; // 无符号右移2位,左边补0
System.out.println(result); // 输出很大正数,因为符号位被清0
}
}
左移与无符号右移的对比
| 运算符 | 移动方向 | 左侧补位 | 典型用途 |
|---|---|---|---|
| << | 向左 | 补0 | 快速乘2的幂 |
| >>> | 向右 | 补0 | 处理无符号逻辑移位 |
使用时的注意点
- 位移位数若超过类型位宽,Java会取模(如int移32位等于没移)。
- 无符号右移只存在于Java等少数语言,C/C++没有>>>。
- 对负数做>>>会得到正数,不要和>>混淆。
小结
左移<<用于放大数值,无符号右移>>>用于忽略符号的二进制右移。理解它们能帮你读懂底层代码,也能在性能敏感场景替代乘除法。