zoukankan      html  css  js  c++  java
  • 如何让Enum枚举实现异或操作

    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)) != 0)
    {
        // ...
    }

    或者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))
    {
        // ...
    }

    总算是学会了以前一直想用而不会的东西。

  • 相关阅读:
    HTTP 方法
    Nodejs 使用 bcrypt 库加密和验证密码
    Flutter 获取本地图片并剪切
    Flutter: 矩形边框
    [bzoj1385]Division expression
    项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】
    hdu1010:Tempter of the Bone(dfs)
    hdu1010:Tempter of the Bone(dfs)
    BZOJ 2820 YY的GCD
    算法的封装与切换—策略模式(四)
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/EnumFlags.html
Copyright © 2011-2022 走看看