Flags, enum (C)

后端 未结 6 1502
既然无缘
既然无缘 2021-02-02 14:54

I\'m not very used to programming with flags, but I think I just found a situation where they\'d be useful:

I\'ve got a couple of objects that register themselves as lis

6条回答
  •  遇见更好的自我
    2021-02-02 15:42

    Your enumeration needs to be powers of two :

    enum
    {
        TAKES_DAMAGE = 1,
        GRABBABLE = 2,
        LIQUID = 4,
        SOME_OTHER = 8
    };
    

    Or in a more readable fashion :

    enum
    {
        TAKES_DAMAGE = 1 << 0,
        GRABBABLE = 1 << 1,
        LIQUID = 1 << 2,
        SOME_OTHER = 1 << 3
    };
    

    Why ? Because you want to be able to combine flags with no overlapping, and also be able to do this:

    if(myVar & GRABBABLE)
    {
        // grabbable code
    }
    

    ... Which works if the enumeration values look like this :

     TAKES_DAMAGE: 00000001
     GRABBABLE:    00000010
     LIQUID:       00000100
     SOME_OTHER:   00001000
    

    So, say you've set myVar to GRABBABLE | TAKES_DAMAGE, here's how it works when you need to check for the GRABBABLE flag:

     myVar:     00000011
     GRABBABLE: 00000010 [AND]
     -------------------
                00000010 // non-zero => converts to true
    

    If you'd set myVar to LIQUID | SOME_OTHER, the operation would have resulted in :

     myVar:     00001100
     GRABBABLE: 00000010 [AND]
     -------------------
                00000000 // zero => converts to false
    

提交回复
热议问题