前几天看到一段代码

int i = GetCount(para1 | para2);

  咋一看有些莫名奇妙,怎么传参的时候带了个或运算,其实这里面是有讲究的,查阅了各方资料,QQ群里赖着大牛问,才搞明白。这个运算可以用来进行多项组合。

举个例子,在设计权限的时候,你肯定会这样设计,权限A,做什么,权限B,做什么,权限C,做什么...如此定义权限,在调用处理函数时,我们直接传对应的权限Id就行,假设用户甲有A权限,我很明确得传权限A的Id,用户乙有B权限,我传B权限的Id,这样看来似乎是合理的。但是,如果用户丙同时有A权限和B权限怎么办呢,你可能会说,那我定义权限的时候定个AB’的权限好了,这样凡是同时有A和B权限的用户传AB’的Id就行了,我一开始也是这么想的,不过,这个做法是不推荐的,也是不巧妙的,假如还有用户同时有ABC权限,或者BC权限,或者CD权限,那么我就什么事也不用干了,就一直在给它定义类型了。

推荐的做法是,传参用“|”运算组合,处理用“&”运算拆分,这样,调用者可以随意组合,而对于处理者,则只定义最基本的单个处理“&”判断即可。看个例子:

定义一个枚举表示权限类型:

public enum Privilege
{
Read = 0x01,
Write = 0x02,
Add = 0x04,
Delete = 0x08,
}
   定义一个处理函数:
public void GetPrivilege(Privilege pri)
{
if ((pri & Privilege.Read) == Privilege.Read)
{
//do something
}
if ((pri & Privilege.Write) == Privilege.Write)
{
//do something
}
if ((pri & Privilege.Add) == Privilege.Add)
{
//do something
}
if ((pri & Privilege.Delete) == Privilege.Delete)
{
//do something
}
}
   然后在其他地方调用:
...
GetPrivilege(Privilege.Read);
GetPrivilege(Privilege.Write);
GetPrivilege(Privilege.Add);
GetPrivilege(Privilege.Delete);
GetPrivilege(Privilege.Read | Privilege.Write);
GetPrivilege(Privilege.Write | Privilege.Add);
GetPrivilege(Privilege.Read | Privilege.Write | Privilege.Add);
...
   你会看到每次调用都会精准得执行。为什么可以这样呢,看我定义的枚举,对应的值分别是
0x01
0x02
0x04
0x08

  为什么我不定义成0x01,0x02,0x03,0x04,这是就依赖于我一开始讲的“|”和“&”运算了,“|”或运算是只要有1方为1就为1,“&”与运算是两者都为1才为1,把0x01,0x02,0x04,0x08转成2进制就是


  任何两个组合,都会在自己的位上变为1。之后再拆分,由于之前组合过,自然就能精准地定位了。比如0x1和0x8组合,组合后就是1001,那么之后通过“&”来拆分,当&0x1时就能进去,&到0x8时也能进去,像这种0x01,0x02,0x04,0x08用行话讲叫“开关位”,今天在QQ群里问人被人说,哎~丢银啊~

     如此,便能以不变应万变,组合出任意结果,真是很方便啊。

c#中利用“|”运算组合多项的更多相关文章

  1. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

  2. Atitit 如何利用先有索引项进行查询性能优化

    Atitit 如何利用先有索引项进行查询性能优化 1.1. 再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:1 1.2. 范围查找 动态索引查找1 1.2.1. 索引联合 所谓的索引联 ...

  3. GBDT基本理论及利用GBDT组合特征的具体方法(收集的资料)

    最近两天在学习GBDT,看了一些资料,了解到GBDT由很多回归树构成,每一棵新回归树都是建立在上一棵回归树的损失函数梯度降低的方向. 以下为自己的理解,以及收集到的觉着特别好的学习资料. 1.GBDT ...

  4. ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

    原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...

  5. 【转】asp.net中利用session对象传递、共享数据[session用法]

    来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...

  6. 在虚拟机的linux中利用VMware Tools实现与windows共享文件

        很多人都知道安装"VMware Tools"可以实现与windows共享,但是其实它的功能远不止此.安装了"VMware Tools"后,虚拟机的网络. ...

  7. asp.net中利用session对象传递、共享数据[session用法]

    下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...

  8. js中位运算的运用

    原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...

  9. 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数

        C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁  //站点:www.cn ...

随机推荐

  1. SQL函数TIMEDIFF在Java程序中使用报错的问题分析

    需求背景 (读者可略过)司机每天从早到晚都会去到不同的自动售货机上补货,而且补货次数和路线等也是因人而异,补货依据是由系统优化并指派.但是目前系统还无法实施有效指挥和优良的补货策略,司机的补货活动因此 ...

  2. 利用mysqldump备份magento数据库

    在Magento开发和维护过程中,经常需要将Magento的数据库导出.导入,这些工作可以通过mysqldump这个工具来实现. 下面我来简单介绍一下mysqldump在导出导入Magento dat ...

  3. 在使用添加按钮给table插入新的一行时遇见的问题总结及处理方法

    添加按钮的功能:点击添加按钮之后完成添加新的一行. 遇见的问题:当多次点击添加按钮生成新的多行之后,生成的每行内部按钮的保存按钮点击事件出现最晚添加的一行的行内保存点击事件执行一次,倒数第二次添加的行 ...

  4. 草根程序员如何进入BAT

        首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - JavaScript - HTML5 - CSS 后端 - Pyt ...

  5. ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用

    早在2010年年底,牛魔王中王在其博客空间牛魔王的作坊中对ArcGIS 10中推出的紧凑型缓存格式进行了详细的解读,详见<ArcGIS 切片缓存紧凑文件格式分析与使用>.紧随着的4年时间里 ...

  6. Android中,Broadcas介绍

    什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们 ...

  7. 1003: Redraiment的遭遇

    1003: Redraiment的遭遇 Time Limit: 1000 Sec  Memory Limit: 128 MBSubmit: 456  Solved: 158[Submit][Statu ...

  8. Java替换手机号掩码

    String tel = "18304072984"; // 括号表示组,被替换的部分$n表示第n组的内容 tel = tel.replaceAll("(\\d{3})\ ...

  9. Python中文编码问题(字符串前面加'u')

    中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各 ...

  10. C#数组协方差

    对于任意两个“引用类型”A和B,如果存在从A到B的隐式引用转换或显式引用转换,则也一定存在从数组类型A[R]到数组类型B[R]的相同的引用转换,其中R可以是任何给定的“秩说明符”,但是这两个数组类型必 ...