java 枚举 或运算_枚举类型与位运算

目录

枚举

位运算

一、枚举

枚举类型是名称与值的组合。

枚举类型是值类型。

1、为什么枚举类型是名称与值得组合?有时我只看到键名称,没有看到相对的值。

public enumOptions

{

Insert,

Update,

Save,

Delete,

Query

}

编译器会给上面补充完整

public enumOptions

{

Insert=0,

Update=1,

Save=2,

Delete=3,

Query=4}

默认从0开始,依次赋值。

2、为什么枚举类型是值类型

因为System.Enum派生于System.ValueType,而System.ValueType直接派生自System.Object

编译器遇到枚举类型时,会有自己的理解:

internal structOptions:System.Enum

{public const Options Insert = (Options)0;public const Options Update = (Options)1;public const Options Save = (Options)2;public const Options Delete = (Options)3;public const Options Query = (Options)4;public intvalue__;

}

虽然Enum类型不能继承,但是可以看出编译器对待枚举类型所形成自己的理解,让我们明白其原理。

3、操作枚举类型

(1) GetUnderLyingType:返回容纳一个枚举类型的值的基础类型

每个枚举类型都有一个基础类型,默认是int.所以上面编译器默认为我们填充int类型的值0~4。

当然这个基础类型也可以自己指定,可以为byte\sbyte\short\usshot\int\uintr\long\ulong

public enum Options:byte{

Insert,

Update,

Save,

Delete,

Query

}

var type= Enum.GetUnderlyingType(typeof(Options));string strs = type.ToString();

枚举类型是基元类型,我们可以对其实例进行许多平时的操作符操作,而每个枚举实例,对应着value__字段。

(2)GetValues:获取一个数组,该数组的每个元素都包含钙元素的名称和对应的值。

System.Collections.Generic.Dictionary opsDic=new System.Collections.Generic.Dictionary();

Options[] ops= (Options[])Enum.GetValues(typeof(Options));foreach (var o inops)

{try{

opsDic.Add((int)o, o.ToString());

}catch(Exception ex)

{

Console.WriteLine("键值{0}已存在", (int)o);

}

}

(3)GetNames:返回一组字符串名称数组。

string[] opsNames = Enum.GetNames(typeof(Options));

(4)Parse和TryParse:可以将数值和名称的字符串转换成对应的枚举类型。

Options turnOption = (Options)Enum.Parse(typeof(Options), "Insert");

Options turnOption1= (Options)Enum.Parse(typeof(Options), "1");

Options tryTurnOption;

Enum.TryParse("insert", false, out tryTurnOption);

二、位标志

我们可能需要多个枚举的组合来满足我们的需要。

位运算是针对二进制位进行的运算,常用的位运算主要有与(&), 或(|)和非(~)

e.m:1 & 0 = 0, 1 | 0 = 1, ~1 = 0

要使枚举类型具有位运算的能力,需要加上特性[FlagsAttribute]简写[Flags]。有些位处于on状态,有些处于off状态。所以通常在定义一个None=0的枚举符号。相对应的值都为2的指数倍。为的是后续的运算。

[Flags]public enumOptions

{

None=0,

Insert= 1, //二进制: 0001

Update = 2, //二进制: 0010

Save = 4, //二进制: 0100

Delete = 8, //二进制: 1000

Query = 16 //二进制:10000

}

权限列表:

Options hasOps = Options.Insert |Options.Update;string ops = hasOps.ToString();

我们看到, Options.Insert | Options.Update=0001|0010,“|”与操作:1 | 0 = 1,是二进制位的运算。我们可以得到结果为:0011。对于这个结果怎么去应用。

权限判断:

if ((hasOps & Options.Insert) ==Options.Insert)

{

Console.WriteLine("Has {0}", Options.Insert);

}

我们可以根据“&”与操作进行权限判断,可以表示为:0011&0001=0001,后面0001==0001,符合条件,有Insert权限。

实例:项目中,有时会进行正则匹配。

string[] imgsArr = Regex.Split(imgsArea, ",", RegexOptions.IgnoreCase | RegexOptions.Multiline);   这句话主要看后面:RegexOptions.IgnoreCase | RegexOptions.Multiline,可以表示为:0001|0010=0011,意思也就是需要同时符合两个条件,

:RegexOptions.IgnoreCase不区分大小写匹配 和 RegexOptions.Multiline 多行模式匹配

[Flags]

public enumRegexOptions

{

None= 0,

IgnoreCase= 1,

Multiline= 2,

ExplicitCapture= 4,

Compiled= 8,

Singleline= 16,

IgnorePatternWhitespace= 32,

RightToLeft= 64,

ECMAScript= 256,

CultureInvariant= 512,

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值