在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下午的时间搞明白其中的道理。

首先每一个权限数都是2的N次方数

如:k1=2 ; //添加

k2=4 ; //删除

k3=8; //修改

...

如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。

如:

purview = k2|k3; // 赋给添加和删除权限

当需要判断在权限串中是否拥有某一权限时,就需要进行按位与。

如:

if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中

{

....

}

说到这里肯定会有疑问了,别急我来细细讲解。

第一,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

上面的if((purview & k1) >0)的结果就是 00001100&00000010 =00000000 也就是(0>0)=false

同样if((purview & k2) >0)的结果就是 00001100&00000100 =00000100=4=k2 也就是 (4>0)=true

这样我们就理解组合权限串和判断权限的原理了,说白了就是对2N次方数的按位与和按位或。

/// <summary>
/// 计算权限总和
/// </summary>
/// <param name="OldStatus">数据库现有权限总和</param>
/// <param name="Action">取消或设置操作(0取消,1设置)</param>
/// <param name="StatusVal">设置操作对应的状态值</param>
/// <returns></returns>
public static int ReturnStatusTotal(int OldStatus, int Action, int StatusVal)
{
int NewStatus = OldStatus;
if (Action == 1)
{
//判断此权限串是否拥有相应操作,不包括时加入权限
if ((OldStatus & StatusVal) <= 0)
{
NewStatus = OldStatus | StatusVal;
}
}
else
{
//判断此权限串是否拥有相应操作,有权限时移除权限
if ((OldStatus & StatusVal) > 0)
{
NewStatus = OldStatus & ~StatusVal;
}
}
return NewStatus;
}

NewStatus = CommonUtilities.ReturnStatusTotal(OldStatus, objRequest.Action, (int)StatusEnum.ZhiDing);

c# 按位与,按位或的更多相关文章

  1. Java_按位与&,按位或,取反,左移,右移运算符

    //按位与运算& System.out.println(0&0);//0 System.out.println(0&1);//0 System.out.println(1&am ...

  2. 位操作符:&位与、|位或、^异或、~求反、<<左移位、>>带符号右移位、>>>无符号右移位

    . 操作符 名称 实例(例中使用字节) 描述 & 位与 10101110 & 10010010 得到10000010 两个相应位上比特如果都为1,则执行 与 操作会得到1 | 位或 1 ...

  3. 二进制按位与(&) 按位或(|)  异或运算(^)

    1.参加运算的两个数据,按照二进制进行按位与的运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; 即:两位同时为“1”,结果才为 ...

  4. 按位与(&)和按位或(|)

    /** * 按位与 : & * 按位或 : | */ public class Demo { /** * 按位与: 为什么(5 & 9)的值等于1 * 按位或: 为什么(5 | 9)的 ...

  5. Java 位运算(移位、位与、或、异或、非)

    Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ...

  6. InstallShield 脚本语言学习笔记

    InstallShield脚本语言是类似C语言,利用InstallShield的向导或模板都可以生成基本的脚本程序框架,可以在此基础上按自己的意愿进行修改和添加.     一.基本语法规则      ...

  7. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  8. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  9. 从0到1,教你实现基于Ruby的watir-webdriver自动化测试

    一.为什么选择Ruby []完全开源. []多平台:Ruby可以运行在Linux, UNIX, Windows, MS-DOS, BeOS, OS/.. []多线程:线程就是指在一个程序中处理若干控制 ...

  10. C++程序设计——知识点总结

    C++程序设计课程的总结,方便以后快速查阅和复习 Week 2 从C走进C++ 函数指针 函数名是函数的入口地址,指向函数的指针称为"函数指针". 比如,qsort库函数: voi ...

随机推荐

  1. canvas之arcTo

    arc与arcTo,从名字都能看出来相似.arcTo也是画曲线的方法,而且他画出的曲线也是正圆的一段弧线.但他的参数和arc简直是不共戴天~ ctx.arcTo(x1,y1,x2,y2,radius) ...

  2. PHP手册笔记

    <?php getenv — 获取一个环境变量的值 $ip = getenv ( 'REMOTE_ADDR' ); // 或简单仅使用全局变量($_SERVER 或 $_ENV) $ip = $ ...

  3. Ubuntu 16.04/CentOS 6.9安装Node.js 6.9.5

    Ubuntu: CentOS: wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz tar -xvf node-v6.9. ...

  4. Microsoft SQL Server 2012 Internals

    http://blog.csdn.net/column/details/learnsqlserver2012.html

  5. appium+python自动化44-appium命令行模式

    前言 appium desktop有个客户端版本,每次运行脚本的时候都要去双击启动才能运行,很显然不太方便,影响效率.那么有没什么办法不启动桌面程序就能运行呢,比如cmd命令行执行? 环境: appi ...

  6. Ubuntu下Firefox无法播放视频的解决方法

    Ubuntu为Firefox安装Adobe Flash Player 解决方法(解决火狐浏览器安装了三个flash插件中的第二个或者第三个插件而无法安装第一个adobe flash插件的方法):在新立 ...

  7. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  8. nyoj42一笔画问题(欧拉图)

    这题事实上说不上难度4.仅仅是一个简单的欧拉图推断,给一些点,首先推断连通性.假设不连通.就谈不上是欧拉图. 假设是连通的,在推断度的数目,每一个顶点都是偶数个或者仅仅有两个是奇数个.这样就能够构成欧 ...

  9. [转]SSIS ADO.NET vs OLEDB

    本文转自:http://social.msdn.microsoft.com/Forums/sqlserver/en-US/1a9e3670-9685-4943-913b-123ecf248a9c/ol ...

  10. 在 Android Studio 2.2 中愉快地使用 C/C++

    转载请注明出处:http://blog.csdn.net/wl9739/article/details/52607010 注:官网上面的技术文章也在不断地汉化中,只是进度有点慢.在我翻译本篇文章的时候 ...