java八种基本类型中仅byte、short、int、long、char支持位运算,float/double不支持,boolean无定义;整数类型位运算需注意类型提升、符号扩展与溢出行为。

Java 八种基本数据类型内存占用固定,但位运算的适用性与行为差异极大——不是所有类型都适合直接参与位操作,也不是所有位运算结果都符合直觉。掌握它们的关键,在于分清“存储大小”“数值表示方式”和“JVM 运行时行为”三层逻辑。
各类型真实内存占用(字节 & 位)
除 boolean 外,其余七种类型在 JVM 规范中明确定义了字节数,与平台无关:
- byte:1 字节(8 位),有符号,范围 -128 ~ 127
- short:2 字节(16 位),有符号,范围 -32768 ~ 32767
- int:4 字节(32 位),有符号,范围 -2147483648 ~ 2147483647
- long:8 字节(64 位),有符号,范围 -9223372036854775808 ~ 9223372036854775807
- char:2 字节(16 位),无符号,范围 '\u0000' ~ '\uffff'(0 ~ 65535)
- float:4 字节(32 位 IEEE 754 单精度),不支持常规位运算(如 &、|、^)
- double:8 字节(64 位 IEEE 754 双精度),同上,不可直接位运算
- boolean:JVM 规范未规定字节数;HotSpot 中字段常对齐为 1 字节,不能用于位运算
验证方式:直接调用包装类常量,如 Byte.BYTES、Integer.BYTES、Character.BYTES,准确且免查表。
哪些类型能安全做位运算?
只有整数类型(byte、short、int、long、char)支持标准位运算符(&、|、^、~、>、>>>)。注意两点关键细节:
-
char 是无符号的,右移时用
>>会按符号位扩展(但 char 没符号位),实际等效于>>>;推荐显式转为int再运算,避免隐式提升歧义 -
byte/short 在运算中自动提升为 int,例如:
byte b = -1; int r = b & 0xFF;才能得到 255;直接b & 0x0F会先扩为 int 再与,结果仍是 int -
long 必须用 L 后缀声明字面量,否则位移操作如
1L 才有效;写成 <code>1 默认是 int,会溢出 -
float/double 不支持位运算,若需查看其二进制表示,用
Float.floatToIntBits()或Double.doubleToLongBits()转为整型再操作
实战常用位运算场景
真正高频使用的不是“炫技”,而是解决具体问题:
-
状态标志压缩:用一个
int存 32 种开关状态,flags |= (1 开启第 6 位,<code>(flags & (1 判断是否启用 -
高效取模(2 的幂):
x & 7等价于x % 8,前提是 x ≥ 0;负数需先做(x & 0x7FFFFFFF) % 8或用Math.floorMod(x, 8) -
高低字节分离(如处理网络字节序):
short s = (short)((b1 & 0xFF) 组装两个 byte 成 short -
快速奇偶判断:
n & 1比n % 2 == 0更快,且对负数也成立(-3 & 1 == 1)
容易踩坑的边界行为
位运算看似底层,但 Java 的类型提升和溢出规则会让结果出人意料:
-
int x = 0x80000000; x >> 1→ 结果是0xC0000000(算术右移,符号位填充),不是0x40000000 -
int y = -1; y >>> 1→0x7FFFFFFF(逻辑右移,高位补 0),这是无符号右移唯一安全获取“半值”的方式 byte b = -1; b → 先提升为 int:-1 变成 0xFFFFFFFF,左移后是 0xFFFFFFFE,再截断回 byte 是 -2 —— 但过程不可见,易误判-
char c = '\uFFFF'; c + 1→ 得到 int 值 65536(超出 char 范围),不是 '\u0000';char 不会自动回绕
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











