c# 二进制或算法实现枚举的HasFlag函数
from:http://www.cnblogs.com/icyJ/archive/2013/02/20/HasFlag.html
在权限的管理中,常常会出现一个权限包含的现象。例如,有三种基本权限:职员A、职员B、职员C.在此基础上,有经理权限,它包括A和B两种权限;还有老板权限,包含A/B/C三种权限。
在代码中,我们可以用枚举来管理这些权限。
[Flags]
public enum EnumHasFlag
{
A = << ,
B = << ,
C = << ,
Manager = A | B,
Boss = A | B | C,
}
这段代码的特点是,定义枚举是用了一个属性来限制[Flags],以及每个值都是用二进制递增来赋值。这样做的好处是,可以通过枚举的HasFlag函数来判断某一个权限是否包含另一个权限。
static void Main(string[] args)
{
var rightA = EnumHasFlag.Boss;
var rightB = EnumHasFlag.Manager;
if (rightA.HasFlag(EnumHasFlag.C)) Console.WriteLine("rightA can do this");
if (rightB.HasFlag(EnumHasFlag.C)) Console.WriteLine("rightB can do this");
Console.ReadKey();
}
最终代码会输出:rightA can do this。这样,通过HasFlag就可以判断枚举值的包含关系,从而进行相应的权限指定和管理。
这样的效果,还可以用过二进制的或运算来实现。基本语句是source | target == source.某个数值A,与另一个数值B进行或运算之后的结果还是A的话,可以判断A包含B。
static void Main(string[] args) {
var A = 1 << 0 | 1 << 1;
if ((A | (1 << 0)) == A)
Console.WriteLine("A has 1<<0");
if ((A | (1 << 2)) != A)
Console.WriteLine("A doesn't have 1<<2"); }
代码的输出结果为:
A has 1<<0
A doesn't have 1<<2
在了解逻辑的前提下,我们可以做如下的开关:
static void Main(string[] args)
{
ControlCenter( << | << );
} static void ControlCenter(int input)
{
if ((input | ( << )) == input) Console.WriteLine("Do 0");
if ((input | ( << )) == input) Console.WriteLine("Do 1");
if ((input | ( << )) == input) Console.WriteLine("Do 2");
}
最终的输出结果可以自己下去测试一下。
本篇用两种方法来实现数值的包含关系管理。仔细的理解了实现的逻辑之后,可以用在很多地方。例如,我们可以将多个设置的是否值揉合成一个字段。形如'10111101',用最少的代码来管理这些设置信息。在选项很少而且对象的活动领域很小的情况下,可以考虑用二进制的或运算来实现。这样实现的优点是,可以不用单独建立枚举,代码量少很多;缺点是,代码的可读性差,调用灵活度也不如枚举的HasFlag,可扩展性也不强。
补充。下面有园友提出了source & target == target的判断算法,来判断source是否包含target。我觉得条件非常充分,而且整个思路比或运算更加清晰。后来查阅了其他的资料,发现对枚举中的1,2,4,8的理解,很多都是从这个算式出发。
static void Main(string[] args)
{
var xx = TestEnum.Manager;
if ((xx & TestEnum.A) == TestEnum.A) Console.WriteLine("Has A");
Console.ReadKey();
} enum TestEnum
{
A = << ,
B = << ,
C = << ,
Manager = A | B,
Boss = A | B | C,
}
c# 二进制或算法实现枚举的HasFlag函数的更多相关文章
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- 二进制GCD算法解析
UPD 2018.3.30 这个好像就是更相减损术的样子emmm UPD 2018.5.22 好像不是更相减损术而是叫Stein算法的样子emmm 蒟蒻来做个二进制GCD笔记. 为什么要写这个东西呢, ...
- 算法总结之欧拉函数&中国剩余定理
算法总结之欧拉函数&中国剩余定理 1.欧拉函数 概念:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)( ...
- 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)
蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...
- 二进制GCD算法 减少%的时间消耗
/* 二进制求最大公约数.由于传统的GCD,使用了%,在计算机运行过程中要花费大量的时间,所以,采取二进制的求法,来减少时间的消耗. 算法: 当a,b都是偶数时: gcd(a,b)=2*gcd(a/2 ...
- 算法:枚举法---kotlin
枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...
- 数据结构与算法之枚举(穷举)法 C++实现
枚举法的本质就是从全部候选答案中去搜索正确的解,使用该算法须要满足两个条件: 1.能够先确定候选答案的数量. 2.候选答案的范围在求解之前必须是一个确定的集合. 枚举是最简单.最基础.也是最没效率的算 ...
- NOI / 2.1基本算法之枚举-8760:Cantor表
总时间限制: 1000ms 内存限制: 65536kB 描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编 ...
- NOI / 2.1基本算法之枚举题解-1(3861字)制作不易
目录 1.15 Counterfeit Dollarhttp://noi.openjudge.cn/ch0201/15/ 2.1749 数字方格
随机推荐
- javascript宿主对象之window.navigator
window.navigator用来反映浏览器及其功能信息的对象. // 检测浏览器版本信息 function getBrowserInfo(){ var Sys = {}; var ua = win ...
- Java 中Comparator 的使用,实现集合排序
目标:实现对Person 对象的年龄,从小到大排序 1.实现排序 package com.app; import java.util.ArrayList; import java.util.Colle ...
- [Android]IllegalStateException: Could not find method onBind(View)
FATAL EXCEPTION: main Process: org.diql.aidldemo, PID: 2274 java.lang.IllegalStateException: Could n ...
- 使用VideoView自定义一个播放器控件
介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...
- 使用greenDAO生成DAO代码
研究greenDAO有几天了,刚开始看别人的博客基本都把我带到了沟里,讲gradle把简单的问题搞得非常复杂,而且都是抄来抄去,看来看去也就那么几篇,实在看不下去了,只得硬着头皮自己琢磨,好在终于把这 ...
- Monyer's game Google Hack关的BT玩法
玩Monyer's game的朋友都知道里面有Google Hack这关,其实这里本来应该用到的技术是逆向回溯搜索,但因为有好几个人都说利用其他方式看到的密码,所以Monyer不得不重新站在玩家的角度 ...
- [AapacheBench工具]web性能压力测试工具的应用与实践
背景:网站性能压力测试是性能调优过程中必不可少的一环.服务器负载太大而影响程序效率是很常见的事情,一个网站到底能够承受多大的用户访问量经常是我们最关心的问题.因此,只有让服务器处在高压情况下才能真正体 ...
- bat自动执行telnet
@del c:\temp.vbs @echo on error resume next >>c:\temp.vbs @echo dim WshShell>>c:\temp.vb ...
- Effective Java 16 Favor composition over inheritance
Inheritance disadvantage Unlike method invocation, inheritance violates encapsulation. Since you don ...
- nginx的配置总结
总体而言,nginx的配置比起apache来是要简洁很多,而言容易理解得多的,另外官网的文档也十分的简洁易懂.我们先看一个简化版的配置文件nginx.conf: #user nobody; worke ...