代码之家  ›  专栏  ›  技术社区  ›  Charu

2^32以上的枚举标志

  •  67
  • Charu  · 技术社区  · 11 年前

    我在应用程序中使用Enum标志。枚举可以有大约50个以上的值,因此值最多可达2^50。我只是想知道,我能用吗 Math.Pow(2, variable) 来计算这些?

    当我尝试这样做时,我会得到 常数值 编译时错误。除了手动计算2的幂并将其输入外,还有其他方法吗?

    以下是我正在做的事情:

    [Flags]
    internal enum RiskStates : long
        {
            None = 0,
            AL = Convert.ToInt64(Math.Pow(2,0)),
            AK = 2,
            AZ = 4,
            AR = 8,
            CA = 16,
            CO = 32,
            CT = 64,
            DC = 128,
            DE = 256,
            FL = 512,
            GA = 1024,
            HI = 2048,
            ID = 4096,
            IL = 8192,
            IN = 16384,
            IA = 32768,
            KS = 65536,
            KY = 131072,
            LA = 262144,
            ME = 524288,
            MD = 1048576,
            MA = 2097152,
            MI = 4194304
    }
    
    3 回复  |  直到 11 年前
        1
  •  128
  •   Danny Beckett    11 年前

    当我尝试这样做时,我会得到 常数值 编译时错误。

    如果你使用 L 后缀以强制其为 long 字面意义上的-但必须手动指定它们仍然不理想。(在阅读代码时,这不是“明显正确的”。)

    你不能使用 Math.Pow 因为表达式必须是编译时常数,但您可以使用位移位:

    None = 0,
    AL = 1L << 0,
    AK = 1L << 1,
    AZ = 1L << 2
    

    等等。无论如何,我认为这更具可读性:)

        2
  •  9
  •   Tom Gruff    9 年前

    如果您更改为使用2的幂更规则的非十进制符号,则不再需要自动生成它们,例如:

    // octal
    AL = 0001L,
    AK = 0002L,
    AZ = 0004L,
    AR = 0010L,
    CA = 0020L,
    CO = 0040L,
    CT = 0100L,
    ...
    
    // hexadecimal
    AL = 0x001L,
    AK = 0x002L,
    AZ = 0x004L,
    AR = 0x008L,
    CA = 0x010L,
    CO = 0x020L,
    CT = 0x040L,
    ...
    
        3
  •  1
  •   Refactor    11 年前

    我很想考虑使用BitArray作为底层结构。