C#二进制位算 权限

  • 关于权限管理,之前所做的都是一个权限对应一条数据,比方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,
            }
        }
    }
    

  

      

      

·····

      

猜你喜欢

转载自www.cnblogs.com/gouhz/p/10793361.html
今日推荐