C++实现基于位运算的权限管理 _ 读写执行权限的组合判断【源码】

老伟大大_4085

老伟大大_4085

2026-04-12

338人浏览

原创

位运算实现权限管理最简高效,需用2的幂定义权限常量(如r=1

c++实现基于位运算的权限管理 _ 读写执行权限的组合判断【源码】

位运算实现权限管理,核心在于用单个整数的各个比特位表示独立权限,读(R)、写(W)、执行(X)各占 1 位,组合与判断都靠位操作完成——不是“能用”,而是最简、最高效、最符合底层语义的做法。

权限常量定义必须用 2 的幂次

每个权限必须独占一个比特位,否则 & 判断会误触发。常见错误是写成 1, 2, 3 或直接用枚举序号。

正确做法:

constexpr int R = 1 
  • 避免用 enum class 直接赋值(如 enum { R=1, W=2, X=4 }),虽可行但失去类型安全和可读性;若用 enum class,必须显式转为 int 才能参与位运算
  • 推荐用 constexpr int 或带 using 别名的 enum(非 class),便于宏/模板推导
  • 不要用负数或高位(如 1)定义权限,除非明确需要 32 位全用,否则易引发符号扩展问题

判断是否拥有某权限:用 & 而非 ==

权限组合是“叠加”而非“相等”。比如用户权限是 RW(0b011),检查是否有 R(0b001),必须用 perm & R,而不是 perm == R。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

典型误用场景:

if (user_perm == R) { ... }        // ❌ 只匹配纯读,忽略读+写的合法情况
if (user_perm & R) { ... }         // ✅ 有读位即通过
if ((user_perm & R) == R) { ... }  // ✅ 等价写法,更强调“包含”
  • user_perm & R 结果是非零即真,C++ 中可直接用于条件判断
  • 当权限类型扩展为多字节(如 uint64_t)时,仍保持该模式,无需改逻辑
  • 切忌用 user_perm % 2 == 1 判断 R:仅对最低位有效,且语义模糊、不可移植

添加/移除权限:用 |= 和 &= ~

动态修改权限时,不能简单赋值覆盖,必须按位操作保底其他权限不变。

user_perm |= W;     // 添加写权限(即使原来没有,也无副作用)
user_perm &= ~X;    // 移除执行权限(~X 是 0b011,与后清零第 2 位)
  • ~X 依赖整数位宽,推荐显式使用无符号类型,如 uint8_t,避免 int 符号位干扰
  • 错误写法:user_perm = user_perm - X —— 若原本不含 X,会得到错误值(如 0b011 - 0b100 = 负数)
  • 批量移除多个权限:user_perm &= ~(R | X),括号必不可少,否则 ~R | X 语义完全不同

权限校验函数要支持组合掩码,别硬编码三连判

真实业务中,常需判断“是否至少具备读+执行”或“禁止写但允许其余”,这时应传入掩码参数,而非写死 if (p&R && p&X)。

bool has_perm(int current, int required) {
    return (current & required) == required;
}
// 使用:
has_perm(user_perm, R | X);   // 是否同时有读和执行
has_perm(user_perm, R);       // 是否有读(任意子集都行)
  • 这个函数比 current & required 更严格:它要求 required 的每一位都置位,适合“最小能力要求”场景
  • 若只需“至少有一个权限匹配”,用 current & required 即可(如黑名单过滤:只要含禁用权限就拒绝)
  • 注意:required 本身不能含非法位(如超出 0b111),否则校验恒为 false;可在 debug 模式下加断言检查

位运算权限真正的复杂点不在实现,而在于团队对掩码含义的共识和文档同步——比如 0b101 到底是 R|X 还是预留位?一旦某人悄悄重定义 X 为 1,所有基于低 3 位的旧判断就静默失效。所以常量定义文件必须被严格 include,且禁止分散定义。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6104

49

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6479

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3145

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4048

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2785

10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

3976

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

306

9

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

20

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习