C#枚举中的位运算权限分配
2024-08-30 18:41:43
什么是位运算
常用的位运算主要有与(&), 或(|)和非(~), 比如:
& = ;
| = ;
~ = ;
运用在权限设计中
先建立一个枚举表示所有的权限管理操作:
[Flags]
public enum Permissions
{
Insert = ,
Delete = ,
Update = ,
Query =
}
[Flags]表示该枚举可以支持C#位运算。
枚举的每一项值, 我们用2的n次方来赋值, 这样表示成二进制时刚好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等。
每一位表示一种权限, 1表示有权限, 0表示没有.
接下来是权限的运算:
1. 权限的加法, 使用与运算来实现。
0001 | 0100 = 0101, 表示同时具有第一位和第三位的权限管理了, 枚举表示为:
Permissions per = Permissions.Insert | Permissions.Update
2. 权限的减法, 使用与运算+非运算来实现。
如上面要去掉Insert权限, 操作为:
Permissions per &= ~Permissions.Insert
// 即是
& ~ = & =
3. 权限的判断, 使用与运算。
判断是否有操作权限时, 把用户的的权限与操作权限进行与运算, 如果得到的结果仍是操作权限管理, 则表示用户具有该权限:
Permissions per = Permissions.Insert | Permissions.Update;
if(per & PermissionsPermissions.Insert = Permissions.Insert)
{
//有操作权限
}
比较过程为 0101 & 0001 = 0001, 0001的0位用与C#位运算把其它位都置成0, 变成只比较1的这一位.
总结
我们总共讲了3种操作方式:
赋与权限、去除权限、判断是包含权限。这样我们的一个权限设计就基本满足了。实际上在MSSQL这些关系数据库中也是支持位运算的。
有时候,比如订单表,需要状态非常多,如果某个状态的设计是流水状态下来的。就可以用“位”来设计这种状态保存方式。并且由于数据库是支持位运算的,所以我们也可以很容易在查询结果时,直接筛选数据。
最新文章
- AI人工智能系列随笔:syntaxnet 初探(1)
- ios动态创建类Class
- 搭建Apache Web服务器
- winform快速开发平台 ->; 基础组件之分页控件
- 如何通过cmd检查自己电脑是否安装了oracle
- isee - 创建项目 - 1
- 【BZOJ-3156】防御准备 DP + 斜率优化
- zzulioj 1907小火山的宝藏交易(dfs记忆化搜索)
- hdu2222 AC自动机
- html5 filereader读取流注意事项
- 4 bytes (32 bits) or 8 bytes (64 bits)
- [转载]EF Code First 学习笔记:约定配置
- UI基础视图----UIWebView总结
- virtualBox使用nat模式下ssh连接
- 关于 ElesticSearch 安装
- gogogo
- GROUP BY 和 ORDER BY一起使用时的注意点
- Typora + Mathpix Snip,相见恨晚的神器
- DevOps实践之一:基于Docker构建企业Jenkins CI平台
- oracle 定期迁移分区表数据(不落地)
热门文章
- Lightoj 1002 - Country Roads(prim算法)
- 还在为AndroidStudio的Gradle版本配置头疼?看看老司机的解决方法吧
- Persisting Data to the Device
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复
- 小程序-demo:template
- 377D
- Html.PartialView(),html.Renderpartial,html.action.html.RenderAction 辅助方法
- bzoj 2525: [Poi2011]Dynamite【二分+树上贪心】
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond【spfa】
- jrebel永久免费使用教程,这个标题怎么样?不能带“激活”俩字?