zoukankan      html  css  js  c++  java
  • 枚举enum使用

    [flags]
    enmu chl{a=1,b=2,c=3}

    用flags声明了一个位域,与枚举不同,位域支持不同的&和|操作。
    对于普通枚举,|和&操作代表二进制比特操作

    enmu ch{a=1,b=2,c=3}

    ch.a|ch.c=01|11=3
    ch.a&ch.b=01&10=0


    对于位域,|和&操作代表逻辑操作
    [flags]
    enmu chl{a=1,b=2,c=3}
    ---------|操作把两边位域的元素组合起来(忽略相同部分,并且根据元素的值的和自动转换

     

    chl.a|chl.b=chl.3 因为1+2=3 这就是位域根据元素和自动转换的例子,但有时这也会给我们带来不便,因为如果chl.c本意不代表chl.a和chl.b的组合,所以我们在设计位域元素值的时候遵循这个原则:从1开始因为0代表&的无相同元素结果后一个数是前一个数的2倍,这样就能保证不出现我们本意之外的自动转换

    enum chl{a=1,b=2,c=4,d=8}。如果某个元素e希望是其他所有元素的组合(a|b|c|d),我们可以把这个元素的值设为所有元素的和

    enum chl{a=1,b=2,c=4,d=8,e=15} (一个位域最好只有一个组合值,那就是all元素)


    chl.c|chl.c=chl.c 这是位域忽略相同部分的例子

    ----------&操作取得两边位域共有的元素,如果没有相同值,返回值0,如果有相同元素,返回相同元素
    chl.b|chl.c&chl.b|chl.a=chl.b
    chl.b|chl.c&chl.a|chl.d=0
    用if(yy&xxx==yy)判断是否存在yy元素
    用if(yy&xxx==0)判断是否不存在yy元素

    设计位域是遵循条件
    1,带[flags]特性
    2,元素值从1开始,后面的元素是前面元素值的2倍,最后一个元素设定为all,值为前面元素值的和
    3,使用时用|操作组合元素项
     

    4,判断时用   if(位域常量组合A==位域常量组合A&位域变量B)判断位域变量B中是否完全包含位域常量组合A

    5, 赋值时用  位域变量=位域变量A&位域变量B
     

    注:位域常量组合A类似 chl.c|chl.b
     

    using System;
    class Test
    {
        /// <summary>
        /// 把枚举名称转换为数字,1==Left,2==Right,3==Left+Right
        /// 如果枚举的值任意加不等于数字,则返回false
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        static bool IsFlagDefined(Enum e)
        {
            decimal d;
            return !decimal.TryParse(e.ToString(), out d);
        }

        [Flags] //位域,比普通枚举更高级
        /// <summary>
        /// 如果去掉 [Flags] 则不能实现3==Left+Right
        /// </summary>
        public enum BorderSides { Left = 1, Right = 2, Top = 4, Bottom = 8 }
       
        static void Main()
        {
            for (int i = 0; i <= 22; i++)
            {           
                //把数字强制转换为枚举名称
                BorderSides side = (BorderSides)i;
                bool bul = IsFlagDefined(side);
                Console.WriteLine(bul + " " + side);
            }
        }
    }

  • 相关阅读:
    PAT 1008--------数组元素的循环右移,你需要记住的
    PAT1049-----枚举法,找规律题,注意降低时间复杂度
    PAT1048----你需要了解并记住的解题思路
    C++中几个输入函数的用法和区别(cin、cin.get()、cin.getline()、getline()、gets()、getchar()))
    PAT1040----关于数学题目的解法新思路值得借鉴,字符的配对
    PAT1029-----介绍字符串的解题思路和部分知识点
    PAT1027-----等差数列的问题或数学问题
    PAT1026----四舍五入的思路,%2d的一些知识
    / 已阅 /PAT1017-------高精度计算,问题的所有可能情况
    LeetCode 无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3569938.html
Copyright © 2011-2022 走看看