用long类型高位空间复合存储多个业务状态,即以64位bit作为64个独立开关,每位对应一个布尔状态(如是否实名),0为未开启、1为已开启;通过左移定义常量(如public static final long is_verified = 1l)确保位不重叠、语义清晰。

用 long 类型的高位空间复合存储多个业务状态,本质是把 64 个 bit 当作 64 个独立开关来用——每个 bit 对应一个状态(比如“是否实名”“是否开通 VIP”“是否绑定手机”),0 表示未开启,1 表示已开启。这种方式不新增字段、不改表结构,还能把几十个布尔值压缩进一个 long 字段里。
明确每个状态对应哪一位
状态位必须互不重叠,推荐用左移定义常量,语义清晰且不易出错:
public static final long IS_VERIFIED = 1L // 第 0 位(最低位)public static final long IS_VIP = 1L // 第 1 位public static final long HAS_PHONE = 1L // 第 2 位public static final long IS_ENTERPRISE = 1L // 最高位(注意:long 是有符号类型,第 63 位为符号位,实际建议只用 0~62 位,或统一用无符号逻辑处理)
避免手写 1, 2, 4, 8...,也别用 int 常量参与 long 运算(易因自动类型提升出错)。
用 | 设置多个状态(开启)
按位或 | 是“开光”操作,只要某位为 1,结果该位就是 1:
long status = IS_VERIFIED | IS_VIP | HAS_PHONE;- 结果二进制类似
0...000111(末三位为 1),十进制值唯一标识这组状态组合
用 & 判断单个状态是否开启
按位与 & 是“探针”操作,仅当目标位和掩码位都为 1 时结果非零:
boolean verified = (status & IS_VERIFIED) != 0;boolean isEnterprise = (status & IS_ENTERPRISE) != 0;- ⚠️ 必须加
!= 0,Java 不允许直接把 long 当布尔条件
用 &~ 清除状态,用 ^ 切换状态
需要动态修改时,位运算依然高效:
- 清除 VIP:
status = status & ~IS_VIP;(先取反再与,把第 1 位强制置 0) - 切换实名状态:
status = status ^ IS_VERIFIED;(异或实现翻转) - 批量清除多个:
status = status & ~(IS_VIP | HAS_PHONE);
数据库存取只需一个 BIGINT 字段,Java 实体中用 long 接收,无需额外 ORM 映射或 JSON 序列化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











