Search code examples
c#enums

Any trick to defining an enum as flags/powers of 2 without eventually needing a calculator?


I know I can multiply but being the lazy programming I am I do not want to.

Has anyone devised some sorcery to auto number the enums as powers of two?

Here's the example I have just to make it concrete:

[Flags]
private enum Targets : uint
{
    None = 0,
    Campaigns = 1,
    CampaignGroups = 2,
    Advertisers = 4,
    AdvertiserGroups = 8,
    AffiliateGroups = 16,
    Affiliates = 32,
    Creatives = 64,
    DetailedLeads = 128,
    DetailedSales = 256,
    ProgramLeads = 512,
    CreativeDeployments = 1024,
    CampaignCategories = 2048,
    Payouts = 4096,
    All = uint.MaxValue
}

Solution

  • Write the values as shifted bits and let the compiler do the math:

    [Flags]
    private enum Targets : uint
    {
        None                = 0,
        Campaigns           = 1,
        CampaignGroups      = 2 << 0,
        Advertisers         = 2 << 1,
        AdvertiserGroups    = 2 << 2,
        AffiliateGroups     = 2 << 3,
        Affiliates          = 2 << 4,
        Creatives           = 2 << 5,
        DetailedLeads       = 2 << 6,
        DetailedSales       = 2 << 7,
        ProgramLeads        = 2 << 8,
        CreativeDeployments = 2 << 9,
        CampaignCategories  = 2 << 10,
        Payouts             = 2 << 11,
        // etc.
    }
    

    James's suggestion is a good one, too. In fact I like this way even better. You could also write it like this:

    [Flags]
    private enum Targets : uint
    {
        None                = 0,
        Campaigns           = 1 << 0,
        CampaignGroups      = 1 << 1,
        Advertisers         = 1 << 2,
        AdvertiserGroups    = 1 << 3,
        AffiliateGroups     = 1 << 4,
        // etc.
    }