Java位运算权限控制通过int的32位映射独立权限,用1<<n定义常量确保单一位为1,|组合权限,&判断权限,&=~X撤销,^切换,高效省存且安全。

Java 中用位运算符实现简易权限控制,核心是把每种权限映射到一个二进制位上,用一个整数(如 int)的 32 个比特位分别表示 32 种独立开关状态。这种方式不依赖多个布尔字段或集合,判断快、存储省、组合灵活。
定义互斥的权限常量
每个权限必须独占一位,常用 1 << n 左移生成,确保二进制中只有一个 1:
-
public static final int VIEW = 1 << 0;→0001 -
public static final int ADD = 1 << 1;→0010 -
public static final int EDIT = 1 << 2;→0100 -
public static final int DELETE = 1 << 3;→1000
避免直接写 1, 2, 4, 8,虽等价但可读性差;更不能混用非 2 的幂(如 3、5),否则会破坏位独立性。
组合与赋予权限
用按位或 | 叠加多个权限,操作无副作用,可重复执行:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 初始:
int userPerms = 0; - 授查看 + 新增:
userPerms |= (VIEW | ADD); - 效果等价于:
userPerms = userPerms | VIEW | ADD;
因为 | 满足结合律和幂等性,a | a == a,所以多次赋同一权限不会出错。
检查是否拥有某项权限
用按位与 & 判断对应位是否为 1:
boolean canEdit = (userPerms & EDIT) != 0;- 原理:只有当
userPerms在 EDIT 对应位上也是 1,结果才非零 - 不要写成
(userPerms & EDIT) == EDIT—— 虽然对单一位成立,但若权限常量设计不当(如含多个位),会误判
撤销或切换权限
用按位与配合取反掩码实现清除,异或 ^ 实现翻转:
- 撤回编辑权:
userPerms &= ~EDIT;(先取反得1110,再与操作清零第 2 位) - 切换删除权限:
userPerms ^= DELETE;(1→0 或 0→1)
注意:撤销操作前无需判断该权限是否存在,&= ~X 对原本不含 X 的值也安全。

















