位掩码本质是用整数每位作独立开关,0关1开,单变量高效承载最多32种状态;状态常量必须为2的幂(如1、2、4、8…),确保每位唯一对应一个状态。

Java 中用位掩码管理多个布尔状态,本质是把一个整数(如 int)的每一位当作一个独立开关——0 表示关闭,1 表示开启。这样单个变量就能紧凑、高效地承载最多 32 种状态,比用多个 boolean 字段或集合更省空间、更快。
定义状态常量:必须是 2 的幂
每个状态对应唯一一位,所以值只能是 1、2、4、8……即 1 形式。硬写 <code>1、2、4 容易出错且难维护,推荐用左移明确位序:
-
public static final int READ = 1 << 0;// 第 0 位 -
public static final int WRITE = 1 << 1;// 第 1 位 -
public static final int EXECUTE = 1 << 2;// 第 2 位 -
public static final int DELETE = 1 << 3;// 第 3 位
这样二进制清晰可读:READ 是 0001,WRITE 是 0010,互不干扰。
组合多个状态:用按位或(|)
把需要启用的状态“叠加”起来,结果整数的二进制中哪些位为 1,就代表哪些状态被激活:
立即学习“Java免费学习笔记(深入)”;
-
int permissions = READ | WRITE;→ 值为3(二进制0011) -
permissions |= EXECUTE;→ 等价于permissions = permissions | EXECUTE,追加执行权限
注意:不要写成 permissions == READ | WRITE,这是错误的赋值+比较混合表达式。
判断是否启用某状态:用按位与(&)并显式比较
检测目标位是否为 1,必须用 & 运算后和 0 比较,因为 Java 条件表达式只接受布尔值:
if ((permissions & WRITE) != 0) { /* 有写权限 */ }if ((permissions & DELETE) == 0) { /* 无删除权限 */ }
直接写 if (permissions & WRITE) 编译不通过——这点极易忽略。
动态修改状态:增、删、切
所有操作都基于位运算,无需遍历、不依赖对象分配,原子高效:
-
添加:用
|=,如flags |= READ; -
移除:用
&= ~,如flags &= ~WRITE;(先取反再与,清零对应位) -
切换:用
^=,如flags ^= EXECUTE;(有则关,无则开)
避免用减法清除状态,比如 flags -= WRITE —— 若该位原本未设置,会误改其他位。
不复杂但容易忽略细节:状态值必须是 2 的幂,判断必须显式比 0,所有操作都基于整数位运算,轻量且高效。


















