在 Java 中,有两种右移运算符:
-
>>(算术右移,有符号右移)- 高位补符号位(即正数补
0,负数补1)。 - 右移
n位,相当于除以2^n,并保留符号。
- 高位补符号位(即正数补
-
>>>(逻辑右移,无符号右移)- 高位永远补
0,不管正数还是负数。 - 只考虑二进制位的移动,不考虑符号。
- 高位永远补
🚀 示例对比
public class Main {
public static void main(String[] args) {
int num1 = 8; // 00000000 00000000 00000000 00001000 (十进制 8)
int num2 = -8; // 11111111 11111111 11111111 11111000 (十进制 -8,二进制补码)
System.out.println(num1 >> 1); // 右移 1 位: 00000000 00000000 00000000 00000100 (4)
System.out.println(num1 >>> 1); // 逻辑右移 1 位:00000000 00000000 00000000 00000100 (4)
System.out.println(num2 >> 1); // 算术右移 1 位: 11111111 11111111 11111111 11111100 (-4)
System.out.println(num2 >>> 1); // 逻辑右移 1 位: 01111111 11111111 11111111 11111100 (2147483644)
}
}
📌 运行结果
4
4
-4
2147483644
🔹 详细分析
-
num1 = 88 >> 1:00001000→00000100(补0,结果仍然是4)。8 >>> 1:00001000→00000100(补0,结果还是4)。
-
num2 = -8-8 >> 1:11111000→11111100(补1,结果仍然是-4)。-8 >>> 1:11111000→01111100(补0,结果变成大正数2147483644)。
📌 结论
| 运算符 | 运算方式 | 高位补充 | 正数示例 | 负数示例 |
|---|---|---|---|---|
>>(算术右移) | 除以 2^n,保留符号 | 补符号位(正数补 0,负数补 1) | 8 >> 1 = 4 | -8 >> 1 = -4 |
>>>(逻辑右移) | 纯粹右移,不考虑符号 | 一律补 0 | 8 >>> 1 = 4 | -8 >>> 1 = 2147483644(变成大正数) |
⚠️ 注意:>>> 在负数时会导致溢出变成一个很大的正数,因为 Java 没有 unsigned int 类型。
💡 什么时候用 >>,什么时候用 >>>?
✅ >>(算术右移) :
- 保留正负号,适用于一般情况,如
x / 2。 - 适用于:除法、符号位需要保留的情况。
✅ >>>(逻辑右移) :
- 适用于无符号数据处理,比如二进制位操作、哈希函数等。
- 适用于:忽略符号位的二进制运算。
🎯 现在你完全理解了 Java 的右移运算! 🚀