Java位运算符直接操作二进制,提升性能:&用于判断奇偶/权限检查,|设置标志,^翻转位或交换变量,~取反,>和>>>右移;适用于状态管理、数值优化及注意优先级与负数陷阱。

Java 中的位运算符是直接操作整数二进制表示的底层工具,能避开分支判断和循环,在状态标记、权限控制、哈希计算等场景中显著提升性能。
常用位运算符及核心用途
Java 提供 6 个基本位运算符,它们不产生对象、不触发 GC,执行速度接近硬件指令:
-
&(按位与):常用于“提取特定位”或“清零某位”,比如
n & 1判断奇偶,flags & READ_PERMISSION检查权限 -
|(按位或):用于“设置标志位”,如
flags |= WRITE_PERMISSION -
^(按位异或):用于“翻转特定位”或“交换变量”,
x ^= y; y ^= x; x ^= y可无临时变量交换(仅限整型且 x≠y) -
~(按位取反):对所有位取反,注意符号位也会翻转,
~n等价于-n - 1 - (左移):相当于乘以 2 的幂,
n ≡ <code>n * 8,无溢出检查 -
>>(带符号右移)和 >>>(无符号右移):前者补符号位,后者补 0;
n >>> 1是安全的无符号除以 2
高效状态管理:用 int 存储多个布尔标志
避免为每个开关定义独立 boolean 字段,改用单个 int 的每一位表示一个状态:
public class Permission {
public static final int READ = 1 private int flags = 0;
public void grant(int perm) { flags |= perm; }
public void revoke(int perm) { flags &= ~perm; }
public boolean has(int perm) { return (flags & perm) != 0; }
}
这样 32 位 int 最多可管理 32 个互斥状态,内存占用远低于布尔数组,且位操作原子性强、无锁开销。
快速数值技巧:避开乘除与条件分支
位运算在数学计算中可替代低效操作:
- 判断是否为 2 的幂:
(n & (n-1)) == 0 && n != 0(利用 n-1 会翻转最低位连续 1 的特性) - 获取最低位的 1:
n & (-n)(利用负数补码特性,如 12(1100)→ 4(0100)) - 无符号取模 2 的幂:
n & (mask),其中 mask = powerOfTwo - 1,比n % 8快得多 - 四舍五入到最近的 2 的幂(向上):
n = n - 1; n |= n >> 1; n |= n >> 2; ... ; return n + 1;
注意事项与陷阱
位运算虽快,但易出错,需注意:
- 运算符优先级低于
==和!=,比较时务必加括号:if ((flags & READ) != 0) - 负数使用补码表示,右移时
>>会扩展符号位,>>>才真正逻辑右移 - 移位超过位宽(如 int 移 32 位)时,Java 只取移位数的低 5 位(32 → 0),
n 等价于 <code>n - 避免在浮点数上使用位运算——必须先用
Double.doubleToRawLongBits()转换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











