讲师中心 微信公众号
AI工具推荐 视频效率加速

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

老伟大大_4085

老伟大大_4085

发布时间:2026-04-12 21:00:34

|

338人浏览过

|

来源于php中文网

原创

位运算实现权限管理最简高效,需用2的幂定义权限常量(如R=1<<0、W=1<<1、X=1<<2),判断用&而非==,添加/移除用|= 和&= ~,校验函数应支持掩码参数并确保团队共识。

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

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

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

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

正确做法:

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

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

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

立即学习“C++免费学习笔记(深入)”;

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<<7,所有基于低 3 位的旧判断就静默失效。所以常量定义文件必须被严格 include,且禁止分散定义。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

6124

2023.10.24

string转int
string转int

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

6519

2023.08.02

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

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

3165

2024.08.29

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

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

4088

2025.08.29

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

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

2805

2025.08.29

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

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

4016

2024.01.03

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

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

306

2025.12.06

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn