用int管理32个布尔状态即以每位为独立开关,通过位运算实现高效读写:设开(|=)、设关(&=~)、判断(&!=0)、切换(^),配合1<<n定义标志,注意符号位与移位范围。

用一个 int 管理 32 个布尔状态,核心就是把每个二进制位当作一个独立开关——第 0 位代表状态 A,第 1 位代表状态 B……直到第 31 位。Java 的 int 是 32 位有符号整数,天然适配,无需额外对象开销,读写快、存储省。
定义清晰的位常量
每个状态对应唯一的 2 的幂次,确保只影响一个比特位:
-
public static final int FLAG_READ = 1 << 0;→0x00000001 -
public static final int FLAG_WRITE = 1 << 1;→0x00000002 -
public static final int FLAG_DELETE = 1 << 2;→0x00000004 - ……
-
public static final int FLAG_ADMIN = 1 << 31;→0x80000000(最高位,注意符号位)
避免手写十六进制,统一用 1 << n 形式,语义明确、不易出错、便于维护。
四种基本操作的写法
所有操作都基于位运算,无分支、无循环、单指令级效率:
立即学习“Java免费学习笔记(深入)”;
-
设为开启:用
|(或)flags |= FLAG_WRITE; -
设为关闭:用
& ~(与 非)flags &= ~FLAG_DELETE; -
判断是否开启:用
&(与)非零即真if ((flags & FLAG_READ) != 0) { ... } -
切换状态:用
^(异或)flags ^= FLAG_ADMIN;
组合与批量处理技巧
多个状态可一次设置或检查,适合权限初始化或条件过滤:
- 组合多个标志:
int userPerm = FLAG_READ | FLAG_WRITE | FLAG_EXECUTE; - 检查是否同时具备若干权限:
(flags & (FLAG_READ | FLAG_WRITE)) == (FLAG_READ | FLAG_WRITE) - 清空某几类相关位(如清除所有“网络”相关标志):
flags &= ~NETWORK_MASK;(需预先定义NETWORK_MASK = FLAG_HTTP | FLAG_SSL | FLAG_WS)
注意事项与边界提醒
实际使用中几个关键细节容易踩坑:
-
int是有符号类型,第 31 位是符号位。若需全 32 位自由使用,建议用int存储但逻辑上视为无符号处理;必要时可用long躲避符号问题,支持 63 个状态(留 1 位作符号) - 移位位数超过 31 会自动对 32 取模(
x << 35等价于x << 3),务必校验n是否在[0, 31]范围内 - 数据库存储时,字段类型推荐
INT(MySQL)或INTEGER(PostgreSQL),兼容性好;避免用TINYINT或SMALLINT限制容量 - 调试时可用
Integer.toBinaryString(flags)查看当前位分布,补前导零更直观:String.format("%32s", Integer.toBinaryString(flags)).replace(' ', '0')


















