白银市住房和城乡建设厅网站首页,营销型网站功能,创建全国文明城市时间,网站建设推广公司范围最近在园子里看到了这篇文章#xff0c;看完这篇会有意外收获#xff1a;C#枚举高级战术https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg想起了很久之前的自己的一篇总结#xff0c;特地找出来------在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下… 最近在园子里看到了这篇文章看完这篇会有意外收获C#枚举高级战术https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg想起了很久之前的自己的一篇总结特地找出来------在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下午的时间搞明白其中的道理。首先每一个权限数都是2的N次方数如k12 ; //添加 k24 ; //删除 k38; //修改 ...如此定义功能权限数当需要组合权限时就需要对各个所拥有的权限数按位或了。如 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|0000000100000001 00000001|000000001 00000000|0000000000000000 也就是说除了0|0结果是0外其它运算结果的都是1 所以 00000100 |00001000 00001100 也就说上面的 purview k2|k3 的二进制值结果是 purview 00000100 |00001000 00001100了第三当对8和4进行按位与操作后结果为 480 00000100 00001000 00000000 同样为什么会是这样呢在进行按位与操作时 000000010000000100000001 000000010000000000000000 000000000000000000000000 也就是说除了11结果是1外其它运算结果的都是0 所以 00000100 00001000 00000000 上面的if(purview k1) 0的结果就是 0000110000000010 00000000 也就是(00)false 同样if(purview k2) 0的结果就是 0000110000000100 000001004k2 也就是 (40)true这样我们就理解组合权限串和判断权限的原理了说白了就是对2N次方数的按位与和按位或。/// summary/// 计算权限总和/// /summary/// param nameOldStatus数据库现有权限总和/param/// param nameAction取消或设置操作0取消1设置/param/// param nameStatusVal设置操作对应的状态值/param/// returns/returnspublic 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);