位掩码本质是用整数每位作独立开关,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 位public static final int WRITE = 1 // 第 1 位public static final int EXECUTE = 1 // 第 2 位public static final int DELETE = 1 // 第 3 位
这样二进制清晰可读:READ 是 0001,WRITE 是 0010,互不干扰。
组合多个状态:用按位或(|)
把需要启用的状态“叠加”起来,结果整数的二进制中哪些位为 1,就代表哪些状态被激活:
-
int permissions = READ | WRITE;→ 值为3(二进制0011) -
permissions |= EXECUTE;→ 等价于permissions = permissions | EXECUTE,追加执行权限
注意:不要写成 permissions == READ | WRITE,这是错误的赋值+比较混合表达式。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
判断是否启用某状态:用按位与(&)并显式比较
检测目标位是否为 1,必须用 & 运算后和 0 比较,因为 Java 条件表达式只接受布尔值:
if ((permissions & WRITE) != 0) { /* 有写权限 */ }if ((permissions & DELETE) == 0) { /* 无删除权限 */ }
直接写 if (permissions & WRITE) 编译不通过——这点极易忽略。
动态修改状态:增、删、切
所有操作都基于位运算,无需遍历、不依赖对象分配,原子高效:
-
添加:用
|=,如flags |= READ; -
移除:用
&= ~,如flags &= ~WRITE;(先取反再与,清零对应位) -
切换:用
^=,如flags ^= EXECUTE;(有则关,无则开)
避免用减法清除状态,比如 flags -= WRITE —— 若该位原本未设置,会误改其他位。
不复杂但容易忽略细节:状态值必须是 2 的幂,判断必须显式比 0,所有操作都基于整数位运算,轻量且高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










