Why do enum permissions often have 0, 1, 2, 4 values?

前端 未结 7 927
你的背包
你的背包 2020-12-04 05:53

Why are people always using enum values like 0, 1, 2, 4, 8 and not 0, 1, 2, 3, 4?

Has this something to do with bit operations, etc.?

7条回答
  •  时光取名叫无心
    2020-12-04 06:20

    Because they are powers of two and I can do this:

    var permissions = Permissions.Read | Permissions.Write;
    

    And perhaps later...

    if( (permissions & Permissions.Write) == Permissions.Write )
    {
        // we have write access
    }
    

    It is a bit field, where each set bit corresponds to some permission (or whatever the enumerated value logically corresponds to). If these were defined as 1, 2, 3, ... you would not be able to use bitwise operators in this fashion and get meaningful results. To delve deeper...

    Permissions.Read   == 1 == 00000001
    Permissions.Write  == 2 == 00000010
    Permissions.Delete == 4 == 00000100
    

    Notice a pattern here? Now if we take my original example, i.e.,

    var permissions = Permissions.Read | Permissions.Write;
    

    Then...

    permissions == 00000011
    

    See? Both the Read and Write bits are set, and I can check that independently (Also notice that the Delete bit is not set and therefore this value does not convey permission to delete).

    It allows one to store multiple flags in a single field of bits.

提交回复
热议问题