var flag = Week.Monday;
flag = flag | Week.Wednesday;
if ((flag & Week.Monday) == Week.Monday )

以上等这些操作是怎么实现的,本章为你讲解。

使用场景

有多个判定条件的时候,如果按条件个数传入参数不是明智之举。可以使用Flags的枚举,传入一个参数解决。

引入Flags

我们知道2进制是可以实现异或等按位运算。默认情况下,枚举中每个元素的基础类型都为int,那我们的Enum怎么和2进制挂钩。

应用 System.FlagsAttribute 属性可以创建位标志枚举, 从而实现ANDORNOT 和 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枚举实现异或操作的更多相关文章

  1. 读书笔记 enum枚举之位标志属性(Flags)浅析

    针对enum枚举来说,可以定义位标志属性,从而使该枚举类型的实例可以存储枚举列表中定义值的任意组合.可以用 与(&).或(|).异或(^)进行相应的运算.废话不多说,代码最直接. //每一个定 ...

  2. c# (ENUM)枚举组合类型的谷歌序列化Protobuf

    c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...

  3. C#将Enum枚举映射到文本字符串

    介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...

  4. MVC3不能正确识别JSON中的Enum枚举值

    一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...

  5. 161208、Java enum 枚举还可以这么用

    在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...

  6. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  7. java之enum枚举(2015年05月28日)

    背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定 ...

  8. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  9. Enum枚举类|注解Annotation

    Enum枚举类 ①枚举类和普通类的差别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器仅仅能使用 private 訪问控制符 枚举类的全部实例必须在枚举类中 ...

随机推荐

  1. linux下快速安装chrome

    linux下安装chrome 1.按下 Ctrl + Alt + t 键盘组合键,启动终端 2.在终端中,输入以下命令: (将下载源加入到系统的源列表.命令的反馈结果如图.如果返回“地址解析错误”等信 ...

  2. TSMBIOS

    TSMBIOS Object Pascal language (Delphi or Free Pascal). https://github.com/RRUZ/tsmbios

  3. matlab绘图与可视化

    1.设置图形对象属性值 set(h,'属性名称','属性值') >> subplot(,,); h1=line([ ],[ ]); text(,0.5,'unchange'); subpl ...

  4. 第一次scrum冲刺

     一.第一次冲刺任务          首先分工做好全局规划,然后基于规划实现全部功能,当然现在只是部分.   二.用户故事        用户进入界面    用户输入账号密码        不记得密 ...

  5. 运维shell脚本函数语法

    在fun.sh 文件里,使用函数来封装脚本内容 usege() { echo "hello world" echo "脚本怎么使用函数......"}usege ...

  6. 剑指Offer 61. 序列化二叉树 (二叉树)

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目地址 https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 ...

  7. 页面添加锚点后如何点击不改变URL?

    直接奔主题,前端简单地锚点实现方法大家都会,无非就是在把 a 标签的 href 写成想要跳到的元素的id ,比如点击 <a href="#box"></a> ...

  8. JPype1使用总结

    目的:使用Locust+Python压测账号资料接口,使用JPype调用java代码,缩短压测脚本编写 前提条件:进行性能压测过程中,需要压测账号相关接口,由于账号相关接口设计到加密解密,用Pytho ...

  9. React native 中使用Fetch请求数据

    一.代码 import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from ' ...

  10. 软件测试_MYSQL

    # MYSQL## 基础知识点### 进入数据库:在偏好设置中打开 — 打开终端 /usr/local/mysql/bin/mysql -u root -p### 可以把完整的命令分成几行打,完后用分 ...