运算符号
|
意义
|
运算对象类型
|
运算结果类型
|
对象数
|
实例
|
~
|
位逻辑非运算
|
整型,字符型
|
整型
|
1
|
~a
|
&
|
位逻辑与运算
|
2
|
a & b
|
||
|
|
位逻辑或运算
|
2
|
a | b
|
||
^
|
位逻辑异或运算
|
2
|
a ^ b
|
||
<<
|
位左移运算
|
2
|
a<<4
|
||
>>
|
位右移运算
|
2
|
a>>2
|
左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。
x<<1= x*2
x<<2= x*4
x<<3= x*8
x<<4= x*16
右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。
x>>1= x/2
x>>2= x/4
x>>3= x/8
x>>4=x/16
常用的位运算主要有与(&), 或(|)和非(~), 比如:
1 & 0 = 0, 1 | 0 = 1, ~1 = 0
在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理.
第一步, 先建立一个枚举表示所有的权限管理操作:
[Flags]
public enum Permissions{
Insert = ,
Delete = ,
Update = ,
Query =
}
[Flags]表示该枚举可以支持C#位运算, 而枚举的每一项值, 我们用2的n次方来赋值, 这样表示成二进制时刚好是1 = 0001, 2 = 0010, 4 = 0100, 8 = 1000等, 每一位表示一种权限, 1表示有该权限, 0表示没有.
接下来是权限的运算:
1. 权限的加法, 使用与运算来实现. 我们知道, 0001 | 0100 = 0101, 这样就表示同时具有第一位和第三位的权限管理了, 枚举表示为:
- Permissions per = Permissions.Insert | Permissions.Update
2. 权限的减法, 使用与运算+非运算来实现, 如上面要去掉Insert权限, 操作为:
- Permissions per &= ~Permissions.Insert即是 0101 & ~0001 = 0101 & 1110 = 0100
3. 权限的判断, 使用与运算, 当判断用一用户是否具有该操作权限时, 要把用户的的权限与操作权限进行与运算, 如果得到的结果仍是操作权限管理, 则表示用户具有该权限:
Permissions per = Permissions.Insert |
Permissions.Update;
if(per & PermissionsPermissions.Insert = Permissions.Insert)
{
//有操作权限
}
比较过程为 0101 & 0001 = 0001, 0001的0位用与C#位运算把其它位都置成0, 变成只比较1的这一位.
C#位运算讲解与示例2的更多相关文章
-
C#位运算讲解与示例
首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...
-
Java二进制和位运算,这一万字准能喂饱你
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...
-
简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
-
C语言位运算、移位运算 经典示例
概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...
-
android位运算简单讲解
一.前言 在查看源码中,经常会看到很多这样的符号“&”.“|”.“-”,咋一看挺高大上:仔细一看,有点懵:再看看,其实就是大学学过的再普通不过的与.或.非.今天小盆友就以简单的形式分享下,同时 ...
-
Java位运算原理及使用讲解
前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...
-
C语言位运算+实例讲解(转)
按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...
-
c#位运算基本概念与计算过程
前言 一些非常基础的东西,在实际工作中没有用到.很少用到.一旦遇到,又不知所云.最近遇到一个问题,把一个int16(short) .两个bool变量整合成一个int32(int),当听到这个要求时,我 ...
-
C# 关于位运算的学习笔记
一.理解什么是位运算 程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),简单来说位运算就是直接对在内存中的二进制数的每位进行运算操作. 二.学习前先了解一下有哪些运算,运算符都怎么 ...
随机推荐
-
键盘ctrl+shift不能切换输入法
1.首先检查输入法是否被卸载,如没被卸载: 2.使用下面如图方法进行设置
-
Eclipse通过集成svn实现版本控制
Eclipse通过集成svn即安装subclipse插件 前面已经讲解过了,这就不说了,作为测试人员继续总结下Eclipse通过集成svn实现的版本控制 首次从SVN代码库中导出代码文件: 1.右键工 ...
-
HDU 1086:You can Solve a Geometry Problem too
pid=1086">You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Mem ...
-
linux之ls -l|grep ";^-";|wc -l命令
查看某文件夹下文件的个数 ls -l |grep "^-"|wc -l 或 find ./company -type f | wc -l 查看某文件夹下文件的个数,包括子文件夹里的 ...
-
在centos6.7中lnmp环境下安装swoole插件和pthreads插件
1.首先在安装lnmp集成包之前,解压lnmp1.3-full.tar.gz,进入到lnmp1.3-full/include/目录下; 2.输入 vi php.sh;编辑php.sh文档.博主安的是p ...
-
Java微信公众平台开发_02_启用服务器配置
源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网*问的项目: 见:[ Java微信公众平台开发_01_本地服务器映射外网 ] 2.一个微信公众平台账号: 去注册: ...
-
ERROR: Cannot change version of project facet Dynamic Web Module to 3.0?
Issue: When you create web app in eclipse with maven configuration, you may get following error. Can ...
-
rac添加新节点的步骤与方法
[转载] https://www.cnblogs.com/hankyoon/p/5174465.html OS: [root@rac ~]# more /etc/oracle-releaseOracl ...
-
unity 脚本说明
MonoBehavour void OnEnable(){ //OnEnable执行在Wake和之前 } void Awake(){ // } void Start(){ } void OnEnabl ...
-
MT【93】二次函数衣服一件
注:最后一行中$f(\dfrac{-x_1}{2})$应改为$f(\dfrac{-a}{2})$.有空再重新编辑.