Skip to content

Instantly share code, notes, and snippets.

@Rovsau
Last active June 19, 2023 16:55
Show Gist options
  • Save Rovsau/240baad5c1af8cc8b3fc1f5ad2e50f9f to your computer and use it in GitHub Desktop.
Save Rovsau/240baad5c1af8cc8b3fc1f5ad2e50f9f to your computer and use it in GitHub Desktop.
Readable Enum Flag configuration.

Use bit-shifting with index to avoid hardcoding complex numbers.
The last flag is the Unsigned Bit, also known as the Most Significant Bit, or left-most bit.
Which is what enables a 32bit mask to represent any combination uniquely.

[System.Flags]
public enum MyEnum : byte
{
    None  = 0,         // 00000000  (0 in decimal)
    Flag1 = 1 << 0,    // 00000001  (1 in decimal)
    Flag2 = 1 << 1,    // 00000010  (2 in decimal)
    Flag3 = 1 << 2,    // 00000100  (4 in decimal)
    Flag4 = 1 << 3,    // 00001000  (8 in decimal)
    Flag5 = 1 << 4,    // 00010000  (16 in decimal)
    Flag6 = 1 << 5,    // 00100000  (32 in decimal)
    Flag7 = 1 << 6,    // 01000000  (64 in decimal)
    Flag8 = 1 << 7     // 10000000  (128 in decimal)
}

By default, enum inherits from int. But if Flag32 is to be valid, it needs to inherit from uint.

[System.Flags]
public enum DummyFlags : uint
{
    None = 0,
    Flag1 = 1 << 0,
    Flag2 = 1 << 1,
    Flag3 = 1 << 2,
    Flag4 = 1 << 3,
    Flag5 = 1 << 4,
    Flag6 = 1 << 5,
    Flag7 = 1 << 6,
    Flag8 = 1 << 7,
    Flag9 = 1 << 8,
    Flag10 = 1 << 9,
    Flag11 = 1 << 10,
    Flag12 = 1 << 11,
    Flag13 = 1 << 12,
    Flag14 = 1 << 13,
    Flag15 = 1 << 14,
    Flag16 = 1 << 15,
    Flag17 = 1 << 16,
    Flag18 = 1 << 17,
    Flag19 = 1 << 18,
    Flag20 = 1 << 19,
    Flag21 = 1 << 20,
    Flag22 = 1 << 21,
    Flag23 = 1 << 22,
    Flag24 = 1 << 23,
    Flag25 = 1 << 24,
    Flag26 = 1 << 25,
    Flag27 = 1 << 26,
    Flag28 = 1 << 27,
    Flag29 = 1 << 28,
    Flag30 = 1 << 29,
    Flag31 = 1 << 30,
    Flag32 = 1U << 31
}

By inheriting from long or ulong, the number of flags and unique combinations can be increased.

[System.Flags]
public enum MyEnum : ulong
{
    None = 0,
    Flag1 = 1UL << 0,
    Flag2 = 1UL << 1,
    Flag3 = 1UL << 2,
    Flag4 = 1UL << 3,
    Flag5 = 1UL << 4,
    Flag6 = 1UL << 5,
    Flag7 = 1UL << 6,
    Flag8 = 1UL << 7,
    Flag9 = 1UL << 8,
    Flag10 = 1UL << 9,
    Flag11 = 1UL << 10,
    Flag12 = 1UL << 11,
    Flag13 = 1UL << 12,
    Flag14 = 1UL << 13,
    Flag15 = 1UL << 14,
    Flag16 = 1UL << 15,
    Flag17 = 1UL << 16,
    Flag18 = 1UL << 17,
    Flag19 = 1UL << 18,
    Flag20 = 1UL << 19,
    Flag21 = 1UL << 20,
    Flag22 = 1UL << 21,
    Flag23 = 1UL << 22,
    Flag24 = 1UL << 23,
    Flag25 = 1UL << 24,
    Flag26 = 1UL << 25,
    Flag27 = 1UL << 26,
    Flag28 = 1UL << 27,
    Flag29 = 1UL << 28,
    Flag30 = 1UL << 29,
    Flag31 = 1UL << 30,
    Flag32 = 1UL << 31,
    Flag33 = 1UL << 32,
    Flag34 = 1UL << 33,
    Flag35 = 1UL << 34,
    Flag36 = 1UL << 35,
    Flag37 = 1UL << 36,
    Flag38 = 1UL << 37,
    Flag39 = 1UL << 38,
    Flag40 = 1UL << 39,
    Flag41 = 1UL << 40,
    Flag42 = 1UL << 41,
    Flag43 = 1UL << 42,
    Flag44 = 1UL << 43,
    Flag45 = 1UL << 44,
    Flag46 = 1UL << 45,
    Flag47 = 1UL << 46,
    Flag48 = 1UL << 47,
    Flag49 = 1UL << 48,
    Flag50 = 1UL << 49,
    Flag51 = 1UL << 50,
    Flag52 = 1UL << 51,
    Flag53 = 1UL << 52,
    Flag54 = 1UL << 53,
    Flag55 = 1UL << 54,
    Flag56 = 1UL << 55,
    Flag57 = 1UL << 56,
    Flag58 = 1UL << 57,
    Flag59 = 1UL << 58,
    Flag60 = 1UL << 59,
    Flag61 = 1UL << 60,
    Flag62 = 1UL << 61,
    Flag63 = 1UL << 62,
    Flag64 = 1UL << 63
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment