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

  

·····

C#二进制位算 权限的更多相关文章

  1. 转:RBAC权限控制

    名词解释: RBAC:Role-Based Access Control,基于角色的访问控制   关键词: RBAC,Java Shiro,Spring Security,   一. RBAC 要解决 ...

  2. 2337:[HNOI2011]XOR和路径 - BZOJ

    昨天才做了一道高斯消元,一下要精度判断,一下又不要精度判断 主要是思路很重要 很容易想到每一个二进制位算一个概率,然后求和,设f[i]为走到从i走到n这一个二进制位为1的概率 f[i]:=∑{f[j] ...

  3. PostgreSQL 安装 & 用户配置

    一.为什么选择 PostgreSQL 自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. MySQL被oracle收购,innodb随之被oracle控制. 二 ...

  4. linux系统编程之文件与io(一)

    经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自 ...

  5. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  6. 【.net 深呼吸】限制执行代码的权限

    前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...

  7. 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

    距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...

  8. 领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net

    在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒!)等原因,被无限期搁置了.最近想想,自己写东西时, ...

  9. SpringMVC + Spring + MyBatis 整合 + Spring shrio + easyUI + 权限管理框架,带shrio session和shrio cache集群实现方案

    工作之余先来写了一个不算规范的简单架子 基于spring mvc + spring + mybatis + Spring shrio 基于redis的集群方案 系统权限部分,分成多个机构,其中每个机构 ...

随机推荐

  1. knn的python代码

    import heapq import random class Classifier: def __init__(self, bucketPrefix, testBucketNumber, data ...

  2. vue生命周期小笔记

    一张图谨记vue每个生命周期的获取状态 beforecreate :可以在这加个loading事件 created :在这结束loading,还做一些初始化,实现函数自执行 mounted : 在这发 ...

  3. Jenkins 邮箱配置及问题解决

    Failed to send out e-mail javax.mail.MessagingException: Could not connect to SMTP host: smtp.rytong ...

  4. 关于Safari浏览器使用的几点总结

    声明:下载的是Safari英文版本,在Windows操作系统下使用. 一.Safari浏览器中的开发者调试工具隐藏得比较深,找了好久才找到的,方法:按一下键盘上的alt键,浏览器上方就会弹出一个开发者 ...

  5. C++中static修饰的静态成员函数、静态数据成员

    1.静态成员函数.静态数据成员 在类中,用static修饰的成员函数被称为静态成员函数,而用static修饰的数据成员就称为静态数据成员:与普通的成员函数和数据成员不同, 静态成员函数和静态数据成员有 ...

  6. 排序:桶排序Bucket sort

    补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 无序数组有个要求,就是成员隶属于 ...

  7. ios10适配

    1: 去除打印多余的log信息: xcode-->Product-->Scheme-->edite Scheme 中在Ecvironment Variables 中添加OS_ACTI ...

  8. SpringMvc与Struts2的对比

    目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较: 1.核心控制器 ...

  9. Postgresql 日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...

  10. gvim 全屏 插件

    1.这里下载插件zip解压后,将fullscreen.dll放到gvim.exe同目录下 2.执行 :call libcallnr()//切换全屏模式 3.上面的命令非常麻烦,可以在_vimrc中ma ...