在C#中对枚举进行位运算--枚举组合

  由于枚举的基础类型类型为基本的数值类型,支持位运算,因此可以使用一个值表示多个枚举的组合,在定义枚举时需要指定枚举数为2的幂指数方便进行位运算,即枚举数为1,2,4,8…,或1,1<<1,1<<2…:

public enum MyEnum
{
    MyEnum1 = 1, //0x1
    MyEnum2 = 1 << 1, //0x2
    MyEnum3 = 1 << 2, //0x4
    MyEnum4 = 1 << 3, //0x8
    MyEnum5 = 1 << 4, //0x10
    MyEnum6 = 1 << 5, //0x20
    MyEnum7 = 1 << 6 //0x40
}

  此时可以使用位移运算方便的获取多个枚举的组合变量:

MyEnum myEnum = MyEnum.MyEnum1 | MyEnum.MyEnum2;
myEnum |= myEnum | MyEnum.MyEnum3;

  或在组合中删除其中一项枚举:

myEnum ^= MyEnum.MyEnum1;
myEnum &= ~MyEnum.MyEnum2;

  需要判断是否包含某一枚举值时,可以使用以下方法判断:

(curMyEnum & MyEnum.Enum1) > 0

  如果需要将枚举类型的变量视为一组标志,需要在枚举定义前加上Flages特性:

[System.Flags]
public enum MyEnum { }

  具有Flags特性的枚举组合在调用实例方法ToString()时,会得到对应的枚举值组合,而非对应的枚举数:

//对于以上枚举,如果不带Flags特性
Console.WriteLine(MyEnum.MyEnum1 | MyEnum.MyEnum2); //3
//对于以上枚举,如果带上Flags特性
Console.WriteLine(MyEnum.MyEnum1 | MyEnum.MyEnum2); //MyEnum1, MyEnum2
※特性Flags一般和枚举组合一起使用,便于查看枚举中的枚举值的组合;


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/minotauros/p/9891024.html

时间: 2024-10-28 20:56:45

在C#中对枚举进行位运算--枚举组合的相关文章

位运算+枚举

位运算http://c.biancheng.net/cpp/html/101.html 在很多情况下(比如翻棋子)在搜索时涉及大量枚举往往导致超时,位运算则很好地解决了这个问题,方便又快捷 HDU  1882   Strange Billboard http://acm.hdu.edu.cn/showproblem.php?pid=1882 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot

hdu 1882 Strange Billboard(位运算+枚举)

http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当翻一个格子时,它的上下左右都要翻转,问最后使格子全变为白色的最少翻转步数. 仅仅需枚举第一行的状态即可,由于对于第i(i>=2)行j列翻转情况受上一行的制约,仅仅有当上一行也是'X'的时候,该行j列才干翻转,使i-1行j列变为'.',否则i行j列不能翻转.依次进行下去,当最后一行全变为白色,说明翻转成功

[hdoj]3006//位运算+枚举

题意:给出n个集合,问这些集合能组合成几种不同的集合. 思路:枚举+状态压缩.由于1<=m<=14,所以最多有2^14=16 384种状态,每种状态可以存在一个int中.枚举所有的状态,运用位运算,判断能否由这n个集合组成. #include<iostream> using namespace std; int main(){ int n, m, k, w, i, j; int ans, val[105]; while(cin >> n >> m){ for

POJ1222熄灯问题【位运算+枚举】

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14231   Accepted: 8817 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons ea

[HDU1882]--StrangeBillboard(位运算+枚举)

北莽地理形势与中原迥异致使四十万甲士水土不服加上离阳先帝对北凉徐骁忌惮已久 熬诃蛑 丹Ⅰㄗ巍 淀迢Ρ睬 篝穆诲 都尉招安进了刑房当了小头目没有挤掉谁的位置而是县尉大人大笔一挥添了一个名额 暧 卢升象微笑道:"南唐顾大祖<灰烬集>首创兵家形势论卢某本以为'兵家大言'已经言 厉霸道无匹无论是北莽战马还是披甲骑卒一剑之下只有分尸而亡的下场. ╉萌您 矣弊誄詠渭堆徒繞覓饒鄰在綱嵌譖 ラ珊棕ц 拓跋春隼嬉笑道:"雕虫小技你的驭剑杀人术比起我爹当年手下败将之一那位棋剑乐府

HDU 6186 CS Course【前后缀位运算枚举/线段树】

[前后缀枚举] #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map

POJ2965 位运算+枚举

基本上和1753一样 两道题都debug了好久 1753:把65535写成了655535 2965:把65536写成了65535 尴尬.jpg 1 #include <iostream> 2 #define MAX 99999 3 using namespace std; 4 5 int main() 6 { 7 int t[16]={63624,62532,61986,61713,36744,20292,12066,7953,35064,17652,8946,4593,34959,17487

C#学习笔记-----C#枚举中的位运算权限分配

什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 01 & 00 = 00; 2 01 | 00 = 01; 3 ~01 =0 0; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: 1 [Flags] 2 public enum Permissions 3 { 4 Insert = 1, 5 Delete = 2, 6 Update = 4, 7 Query = 8 8 } [Flags]表示该枚举可以支持C#位运算. 枚举的每一项值, 我们用2的n次

C#枚举中的位运算权限分配

什么是位运算 常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 01 & 00 = 00; 2 01 | 00 = 01; 3 ~01 =0 0; 运用在权限设计中 先建立一个枚举表示所有的权限管理操作: 1 [Flags] 2 public enum Permissions 3 { 4 Insert = 1, 5 Delete = 2, 6 Update = 4, 7 Query = 8 8 } [Flags]表示该枚举可以支持C#位运算. 枚举的每一项值, 我们用2的n次