C#枚举中的位运算权限分配

什么是位运算

常用的位运算主要有与(&), 或(|)和非(~), 比如:

1 01 & 00 = 00;
2 01 | 00 = 01;
3 ~01 =0 0;

运用在权限设计中

  先建立一个枚举表示所有的权限管理操作:

1   [Flags]
2   public enum Permissions
3   {
4   Insert = 1,
5   Delete = 2,
6   Update = 4,
7   Query = 8
8   }

  [Flags]表示该枚举可以支持C#位运算。

  枚举的每一项值, 我们用2的n次方来赋值, 这样表示成二进制时刚好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等。

  每一位表示一种权限, 1表示有权限, 0表示没有.

接下来是权限的运算:

  1. 权限的加法, 使用与运算来实现。

  0001 | 0100 = 0101, 表示同时具有第一位和第三位的权限管理了, 枚举表示为:

1 Permissions per = Permissions.Insert | Permissions.Update

  2. 权限的减法, 使用与运算+非运算来实现。

  如上面要去掉Insert权限, 操作为:

1 Permissions per &= ~Permissions.Insert
2 // 即是
3 0101 & ~0001 = 0101 & 1110 = 0100

  3. 权限的判断, 使用与运算。

  判断是否有操作权限时, 把用户的的权限与操作权限进行与运算, 如果得到的结果仍是操作权限管理, 则表示用户具有该权限:

1   Permissions per = Permissions.Insert | Permissions.Update;
2   if(per & PermissionsPermissions.Insert = Permissions.Insert)
3   {
4   //有操作权限
5   }

  比较过程为 0101 & 0001 = 0001, 0001的0位用与C#位运算把其它位都置成0, 变成只比较1的这一位.

总结

  我们总共讲了3种操作方式:

  赋与权限、去除权限、判断是包含权限。这样我们的一个权限设计就基本满足了。实际上在MSSQL这些关系数据库中也是支持位运算的。

  有时候,比如订单表,需要状态非常多,如果某个状态的设计是流水状态下来的。就可以用“位”来设计这种状态保存方式。并且由于数据库是支持位运算的,所以我们也可以很容易在查询结果时,直接筛选数据。

时间: 2024-08-06 11:30:50

C#枚举中的位运算权限分配的相关文章

C#学习笔记-----C#枚举中的位运算权限分配

什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 01 & 00 = 00; 2 01 | 00 = 01; 3 ~01 =0 0; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: 1 [Flags] 2 public enum Permissions 3 { 4 Insert = 1, 5 Delete = 2, 6 Update = 4, 7 Query = 8 8 } [Flags]表示该枚举可以支持C#位运算. 枚举的每一项值, 我们用2的n次

C#枚举中的位运算权限分配浅谈

常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第一步, 先建立一个枚举表示所有的权限管理操作: [Flags] public enum Permissions { Insert = 1, Delete = 2, Update = 4, Query = 8 } [Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的n次方来赋值, 这样表

枚举中的位运算

为什么枚举中位运算都可以使用并运算? 1.  什么是枚举中的位运算? 例如 int a = 1 << 0; //1左移0位    1*2^0 = 1; int b = 1 << 1; //1左移1位   1*2^1 = 2; int c = 1 << 2; //1左移2位   1*2^2 = 4; int d = 1 << 3; //1左移3位   1*2^3 = 8; 并运算 a | b 01 10 -------------- 11 ==1+2 int

枚举类型与位运算

目录 枚举 位运算 一.枚举 枚举类型是名称与值的组合. 枚举类型是值类型. 1.为什么枚举类型是名称与值得组合?有时我只看到键名称,没有看到相对的值. public enum Options { Insert, Update, Save, Delete, Query } 编译器会给上面补充完整 public enum Options { Insert=0, Update=1, Save=2, Delete=3, Query=4 } 默认从0开始,依次赋值. 2.为什么枚举类型是值类型 因为Sy

C#位运算示例和enum中的位运算

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与. 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { ....

关于c语言中的位运算。。。

位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~      (not)        取反 ^       (xor)        异或 >>    (shr)    右移一位 <<    (shl)     左移一位 运算说明: === 1. and运算 === and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可

深入研究js中的位运算及用法

什么是位运算? 位运算是在数字底层(即表示数字的 32 个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序逻辑,缺点是很不直观,许多场合不能够使用. 位运算只对整数起作用,如果一个运算子不是整数,会自动转为整数后再运行.虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数. 关于二进制 ==以下来

java中的位运算

刚才在imooc看php基础发现一个特别容易让我们理解的描述[关于异或运算的] 之前学习java的时候 位运算有4种,当时是这样记录的: &  按位与 (and) 两个对应二进制都为1则为1,其余全为0 |   按位或(or) 两个二进制数有一个为1则为1,只有两个0才为0 ~  按位非(NOT) 二进制中取反 ^  按位异或(XOR) 两个二进制中相同为则为0,不同则为1             其实最难以理解的就是这个异或运算. 直接搬过来(原网址点我): 我们可以从投票的角度来理解逻辑运算

C/C++中的位运算

位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符.     位运算符的优先级从高到低,依次为~.&.^.|, 其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&)