java位运算权限控制将每种权限映射为2的幂次方值(如read=1、write=2),通过|、&、~实现赋权、撤权与校验,高效省内存且支持组合;权限常量推荐用public static final int或枚举定义。

Java 中用位运算符实现权限控制,核心是把每种权限映射为一个唯一的 2 的幂次方值(如 1、2、4、8…),再通过按位或(|)、按位与(&)、按位非(~)等操作完成赋予权限、撤销权限和检查权限。这种方式高效、省内存,且天然支持权限组合。
定义权限常量
每个权限对应一个二进制中唯一一位为 1 的整数,推荐用 public static final int 或枚举(配合 int 值)定义:
public class Permission {
public static final int READ = 1 用左移比直接写 1、2、4、8 更清晰,也避免手误。所有权限值互不重叠,保证按位运算无干扰。
赋予多个权限(按位或)
用户权限用一个整数变量(如 int userPerms)存储,初始为 0。赋予权限即用 |= 把对应权限位设为 1:
-
userPerms |= Permission.READ;→ 赋予读权限 -
userPerms |= Permission.READ | Permission.WRITE;→ 同时赋予读写 -
userPerms |= Permission.ADMIN;→ 再加管理员权限
即使重复执行,结果不变(因为 1 | 1 == 1),幂等安全。
撤销某个权限(按位与 + 按位非)
撤销权限本质是把某一位从 1 变成 0,其余位保持不变。方法是:用 ~权限值 得到掩码,再与当前权限做 &:
-
userPerms &= ~Permission.WRITE;→ 撤销写权限(~2是 ...11111101,与后清零第 1 位) -
userPerms &= ~(Permission.READ | Permission.DELETE);→ 同时撤销读和删
注意不能用 -=,比如 userPerms -= Permission.WRITE 在有其他权限时会出错(如 6 - 2 = 4,但 6 表示 READ+DELETE,减完却只剩 DELETE,丢失了 READ)。
检查是否拥有某权限(按位与)
检查就是判断对应位是否为 1:将当前权限与目标权限做 &,结果等于该权限值即表示拥有:
-
if ((userPerms & Permission.READ) == Permission.READ)→ 有读权限 -
if ((userPerms & (Permission.READ | Permission.WRITE)) == (Permission.READ | Permission.WRITE))→ 同时具备读写(全匹配) -
if ((userPerms & Permission.ADMIN) != 0)→ 有 admin 权限(admin 是单权限,可简写)
务必用括号包裹位运算表达式,避免优先级问题(& 优先级低于 ==)。
这种模式在 Spring Security 的 SimpleGrantedAuthority 不直接使用,但底层权限模型(如 Unix 文件权限、数据库 flag 字段)广泛采用。Java 8+ 也可结合 EnumSet 提供更类型安全的封装,但位运算仍是轻量级权限控制的首选方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











