如何让Enum枚举实现异或操作
var flag = Week.Monday;
flag = flag | Week.Wednesday;
if ((flag & Week.Monday) == Week.Monday )
以上等这些操作是怎么实现的,本章为你讲解。
使用场景
有多个判定条件的时候,如果按条件个数传入参数不是明智之举。可以使用Flags的枚举,传入一个参数解决。
引入Flags
我们知道2进制是可以实现异或等按位运算。默认情况下,枚举中每个元素的基础类型都为int,那我们的Enum怎么和2进制挂钩。
应用 System.FlagsAttribute 属性可以创建位标志枚举, 从而实现AND、OR、NOT 和 XOR 按位运算。
[Flags]
enum Days
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
Days 具有 Flags 属性,且它的每个值都是 2 的若干次幂,指数依次递增。
| FLag | 2进制 | 10进制 | 16进制 |
| Sunday | 0000001 (2) | 1 | 0x001 |
| Monday | 0000010 (2) | 2 | 0x002 |
| Tuesday | 0000100 (2) | 4 | 0x004 |
| Wednesday | 0001000 (2) | 8 | 0x008 |
| Thursday | 0010000 (2) | 16 | 0x010 |
| Friday | 0100000 (2) | 32 | 0x020 |
| Saturday | 1000000 (2) | 64 | 0x040 |
按位运算
添加条件:| 操作
flag里面包含星期一与星期三的值
var flag = Week.Monday;
flag = flag | Week.Wednesday;
删除条件:& ~ 操作
flag里面只剩下星期一的值
var flag = Week.Monday | Week.Wednesday;
flag = flag & ~Week.Wednesday;
Flag值判断方法:
按位操作
var flag = Week.Monday | Week.Wednesday; // "flag" 为 "Monday"
if ((flag & Week.Monday) == Week.Monday )
{
// ...
} // "flag" 为"Monday 与 Wednesday"
if ((flag & (Week.Monday | Week.Wednesday)) == (Week.Monday | Week.Wednesday))
{
// ...
} // "flag" 为 "Monday 或者 Wednesday"
if ((flag & (Week.Monday | Week.Wednesday)) != )
{
// ...
}
或者HasFlag方法
var flag = Week.Monday | Week.Wednesday; // "flag" 为 "Monday"
if (flag.HasFlag(Week.Monday))
{
// ...
} // "flag" 为 "Monday 与 Wednesday"
if (flag.HasFlag(Week.Monday) && flag.HasFlag(Week.Wednesday))
{
// ...
} // "flag" 为 "Monday 或者 Wednesday"
if (flag.HasFlag(Week.Monday) || flag.HasFlag(Week.Wednesday))
{
// ...
}
总算是学会了以前一直想用而不会的东西。
如何让Enum枚举实现异或操作的更多相关文章
- 读书笔记 enum枚举之位标志属性(Flags)浅析
针对enum枚举来说,可以定义位标志属性,从而使该枚举类型的实例可以存储枚举列表中定义值的任意组合.可以用 与(&).或(|).异或(^)进行相应的运算.废话不多说,代码最直接. //每一个定 ...
- c# (ENUM)枚举组合类型的谷歌序列化Protobuf
c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...
- C#将Enum枚举映射到文本字符串
介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...
- MVC3不能正确识别JSON中的Enum枚举值
一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...
- 161208、Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- java之enum枚举(2015年05月28日)
背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
- Enum枚举类|注解Annotation
Enum枚举类 ①枚举类和普通类的差别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器仅仅能使用 private 訪问控制符 枚举类的全部实例必须在枚举类中 ...
随机推荐
- 马凯军201771010116《面向对象与程序设计Java》第十周学习总结
一.理论知识学习部分 泛型类的约束与局限性: 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 不能抛出也不能捕获泛型类实例 参数化类型的数组不合法 不能实例化类型变量 泛型类的 ...
- MySQL在高内存、IO利用率上的几个优化点
以下优化都是基于CentOS系统下的一些MySQL优化整理,有不全或有争议的地方望继续补充完善. 一.mysql层面优化 1. innodb_flush_log_at_trx_commit 设置为2设 ...
- python—文件创建
# 1.文件操作# day1.txt# 1.文件路径:E:\day1.txt# 2.编码方式:utf-8.gbk# 3.操作方式:只读,只写,追加,读写,写读# 以什么编码方式储存的方式储存就以什么编 ...
- c++利用类进行单链表的插入,删除,清空操作
#if 1 #include <iostream> #include <stdlib.h> #include <time.h> #include <fstre ...
- Linux 驱动——Led驱动2
led_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/init ...
- java中的i++与++i的区别以及除法、模的用法(基础)
java中i++与++i的区别: 例如:int i=3; (先运算再赋值)j=++i; i的值先变成4,再赋给j,j的值为4: (先赋值再运算)j=i++; 先将i的值3赋给j,j的值为3,然后i变成 ...
- 06_mysql先分页查询再排序
数据库字段: SELECT * FROM (SELECT * FROM tb_item LIMIT 3,3) temp_table ORDER BY id DESC; 查询结果:
- word中插入myth type公式行距变大的问题
在写文章时,我遇到了在word中插入myth type公式时,行距明显变大的问题,我通过改变段落中的行距没有解决问题,在网上查了一下,找到一些解决方法,仅供参考. 解决办法
- pip install -r requirements.txt
生成文件 pip freeze > requirements.txt pip install --help Usage: pip install [options] <requiremen ...
- PyCharm提交代码到git