前几天看到一段代码
int i = GetCount(para1 | para2);
咋一看有些莫名奇妙,怎么传参的时候带了个或运算,其实这里面是有讲究的,查阅了各方资料,QQ群里赖着大牛问,才搞明白。这个运算可以用来进行多项组合。
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进制就是
0001 0010 0100 1000
任何两个组合,都会在自己的位上变为1。之后再拆分,由于之前组合过,自然就能精准地定位了。比如0x1和0x8组合,组合后就是1001,那么之后通过“&”来拆分,当&0x1时就能进去,&到0x8时也能进去,像这种0x01,0x02,0x04,0x08用行话讲叫“开关位”,今天在QQ群里问人被人说,哎~丢银啊~
原文:http://www.cnblogs.com/zoexia/p/3522408.html