博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 二进制或算法实现枚举的HasFlag函数
阅读量:5775 次
发布时间:2019-06-18

本文共 1967 字,大约阅读时间需要 6 分钟。

在权限的管理中,常常会出现一个权限包含的现象。例如,有三种基本权限:职员A、职员B、职员C.在此基础上,有经理权限,它包括A和B两种权限;还有老板权限,包含A/B/C三种权限。

在代码中,我们可以用枚举来管理这些权限。

复制代码
[Flags]
public
enum EnumHasFlag
{
A =
1 <<
0,
B =
1 <<
1,
C =
1 <<
2,
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(
1 <<
0 |
1 <<
3);
}
static
void ControlCenter(
int input)
{
if ((input | (
1 <<
0)) == input) Console.WriteLine(
"
Do 0
");
if ((input | (
1 <<
1)) == input) Console.WriteLine(
"
Do 1
");
if ((input | (
1 <<
2)) == 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 =
1 <<
0,
B =
1 <<
1,
C =
1 <<
2,
Manager = A | B,
Boss = A | B | C,
} 本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/4303004.html,如需转载请自行联系原作者
你可能感兴趣的文章
博客检查
查看>>
php扩展下载网站
查看>>
自定义消息弹出框的一个很不错的实例
查看>>
使用Bootstrap的suggest下拉插件
查看>>
java访问权限
查看>>
VBS字符编码的说明
查看>>
c#接口作为参数传递、返回
查看>>
通过分析WP的代码来学习PHP。1
查看>>
docker 6 docker运行的底层原理
查看>>
ARM linux的启动部分源代码简略分析【转】
查看>>
如何在linux系统下配置无线网卡?【转】
查看>>
王可言:「萬物聯網+人聯網+隨時在線」的新時代
查看>>
JAVA编程思想一
查看>>
java四种线程池简介,使用
查看>>
一般处理程序(.ashx)中session的使用方法
查看>>
EasyUI笔记(二)Layout布局
查看>>
ios View之间的切换 屏幕旋转
查看>>
js创建表格时最好要创建tbody元素
查看>>
ASN.1探索 - 3 编码规则与传输语法(1 - BER)(转)
查看>>
BZOJ2208:[JSOI2010]连通数(DFS)
查看>>