- 关于权限管理,之前所做的都是一个权限对应一条数据,比方A页面有增删改查四个权限,那么用户在权限管理表中相对应AA页面有四条记录。后来改用二进制运算,发现省事很多。
- 首先说下位运算 熟悉一下操作符,懒得插入表格了,字节贴一张别人的图
- 看效果图,用一个枚举列出所有权限编号 之后八权限编号带进去运算,可以得到用户是否拥有该权限
- 所有A 值 A1 A2 A3 都是2的n次方数字经过 或位算 | 得到的 2 | 4=6 和相加的如果一样 但是 2|4 缺不能喝2+4 相提并论 。一个是一样的。
- 小明一开始 权限为0 经过或位算 加上 增、删、改 三个个权限 2、4 、8 结果为 14 这时候判断是否是否 有2 删除权限 答案是有的。
- 这类的运算使用的二进制
- 第一,2的8位二进制值为00000010
4的8位二进制值为00000100
8的8位二进制值为00001000
- 第二,当对8和4进行按位或操作后,结果为:
4|8 = 12
00000100 |00001000 = 00001100
为什么会是这样呢?在进行按位或操作时 00000001|00000001=00000001 ;00000001|00000000=1 ;00000000|00000000=00000000
也就是说除了0|0结果是0外,其它运算结果的都是1
所以 00000100 |00001000 = 00001100
也就说上面的 purview = k2|k3 的二进制值结果是 purview =00000100 |00001000 =00001100了
- 第三,当对8和4进行按位与操作后,结果为:
4&8=0
00000100 &00001000 = 00000000
同样为什么会是这样呢?在进行按位与操作时 00000001&00000001=00000001 ;
00000001&00000000=00000000 ;00000000&00000000=00000000
也就是说除了1&1结果是1外,其它运算结果的都是0
所以 00000100 &00001000 = 00000000
/****************************** * 项目 二进制位算 * 描述 权限系统 * 作者 @Sun * 日期 2019-04-29 *******************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { class Program { static int a = 0; //定义小明初始权限 0无权限 static void Main(string[] args) { Console.WriteLine("查询是否有某一权限"); Console.Write("(A & B)输入A值:"); int A = Convert.ToInt32(Console.ReadLine()); Console.Write("(A & B)输入B值:"); int B = Convert.ToInt32(Console.ReadLine()); int C = A & B; Console.WriteLine("(A & B)运算结果:A & B = {0}", C); Console.WriteLine("添加某一权限"); Console.Write("(A1 | B1)输入A1值:"); int A1 = Convert.ToInt32(Console.ReadLine()); Console.Write("(A1 | B1)输入B1值:"); int B1 = Convert.ToInt32(Console.ReadLine()); int C1 = A1 | B1; Console.WriteLine("(A1 | B1)运算结果:A1 & B1 = {0}", C1); Console.WriteLine("删除某一权限"); Console.Write("(A2 &~ B2)输入A2值:"); int A2 = Convert.ToInt32(Console.ReadLine()); Console.Write("(A2 &~ B2)输入B2值:"); int B2 = Convert.ToInt32(Console.ReadLine()); int C2 = A2 &~ B2; Console.WriteLine("(A2 &~ B2)运算结果:A2 &~ B2 = {0}", C2); Console.WriteLine("------------------------------------------"); Console.WriteLine("小明初权限 {0}", a); for (int i = 0; i < 3; i++) { Console.Write("{0}-*- 给小明添加权限 ",i); int a1 = Convert.ToInt32(Console.ReadLine()); a = a1 | a; Console.WriteLine("小明拥有权限 {0}", a); } Console.Write("查看小明是否拥有某一权限"); int a2 = Convert.ToInt32(Console.ReadLine()); if ((a & a2) > 0) { Console.WriteLine("有"); } else { Console.WriteLine("无"); } Console.ReadKey(); } /// <summary> /// 权限枚举 /// 2的N次方 2^n /// </summary> public enum Permission { Read = 1, Add = 2, Update = 4, Delete = 8, 权限1 = 16, 权限2 = 32, 权限3 = 64, 权限4 = 128, 权限5 = 256, 权限6 = 512, } } }
·····