web-dev-qa-db-ja.com

2 ^ 32を超える列挙型フラグ

アプリケーションで列挙型フラグを使用しています。列挙型には約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
}
67
Charu

これを実行しようとすると、定数値コンパイル時エラーが発生します。

Lサフィックスを使用して強制的にlongリテラルにした場合、実際には問題ありませんが、すべてを手動で指定する必要があるのは理想的ではありません。 (コードを読むときは「明らかに正しい」わけではありません。)

式はコンパイル時定数でなければならないため、Math.Powを使用することはできませんが、ビットシフトを使用することはできます。

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

などとにかく読みやすいと思います:)

125
Jon Skeet

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,
...
9
Tom

基礎となる構造としてBitArrayを使用することを検討したいと思います。

1
Refactor