java位移操作仅支持整数类型,byte/short/char先提升为int再运算,int按32位、long按64位补码运算,boolean/float/double不支持;左移补符号位,无符号右移>>>补0。

Java 中基本数据类型做位移操作,核心是理解「哪些类型能直接参与」和「实际执行时如何转换」。位移运算符(、<code>>>、>>>)只对整数类型有效,且底层一律按 int 或 long 的二进制补码形式运算。
位移操作支持的数据类型范围
Java 允许对以下基本类型使用位移运算符:
-
byte、short、char、int、long
但注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
byte、short、char不会直接位移,而是先隐式提升为 int 类型(32 位),再执行位移; -
int按 32 位补码运算,移位位数对32取模(如a 等价于 <code>a ); -
long按 64 位补码运算,移位位数对64取模; -
boolean、float、double不支持位移,编译报错。
例如:
byte b = 3; int result = b <hr><h3>三种位移运算符的行为差异</h3>
| 运算符 | 名称 | 行为说明 |
|---|---|---|
|
左移 | 所有位向左移动 n 位,右侧补 0;高位溢出丢弃;等价于 ×2ⁿ(不溢出时) |
>> |
带符号右移 | 向右移动 n 位,左侧补原符号位(正数补 0,负数补 1);等价于 ÷2ⁿ 向下取整 |
>>> |
无符号右移 | 向右移动 n 位,左侧一律补 0;负数会变成很大的正数 |
示例(以 int 为例):
int x = -8; // 二进制补码: 11111111 11111111 11111111 11111000 System.out.println(x >> 2); // → -2 (符号扩展,高位补1) System.out.println(x >>> 2); // → 1073741822 (高位全补0,变成正数)
小心这些常见陷阱
- 移位位数为负数?Java 会先对位数取模再调整:
a → 实际执行 <code>a (因为 <code>-1 % 32 + 32 = 31) -
byte b = -1; b >> 1不等于-1 >> 1:b提升为int后是0xFFFFFFFF,再右移 →-1;但若你写((byte)-1) >> 1,结果仍是-1(因提升后未截断); -
char是无符号 16 位,但提升为int后仍按有符号处理:char c = '\uFFFF'; c >> 1→0x7FFFFFFF(不是你直觉的0x7FFF),因为c转int后是0x0000FFFF,再右移。
实用小技巧(附代码逻辑)
- 判断奇偶:
n & 1 == 0→ 偶数 - 快速乘除 2 的幂:
x ≡ <code>x * 8,x >> 4≡x / 16(仅适用于非负数或接受向下取整) - 提取低 4 位:
x & 0xF - 清除最低位 1:
x & (x - 1)(常用于判断是否为 2 的幂) - 取绝对值(不用 Math.abs):
int abs(int x) { int y = x >> 31; // 符号位广播到所有位:x≥0→0,x
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










