How can I remove a flag in C?

前端 未结 3 1069
感动是毒
感动是毒 2020-12-12 10:23

There is a variable that holds some flags and I want to remove one of them. But I don\'t know how to remove it.

Here is how I set the flag.

my.emask          


        
相关标签:
3条回答
  • 2020-12-12 10:33

    It's important to note that if the variable being manipulated is larger than an int, the value used in the 'and not' expression must be as well. Actually, one can sometimes get away with using smaller types, but there are enough odd cases that it's probably best to use type suffixes to make sure the constants are large enough.

    0 讨论(0)
  • 2020-12-12 10:42

    Short Answer

    You want to do an Bitwise AND operation on the current value with a Bitwise NOT operation of the flag you want to unset. A Bitwise NOT inverts every bit (i.e. 0 => 1, 1 => 0).

    flags = flags & ~MASK; or flags &= ~MASK;.

    Long Answer

    ENABLE_WALK  = 0    // 00000000
    ENABLE_RUN   = 1    // 00000001
    ENABLE_SHOOT = 2    // 00000010
    ENABLE_SHOOTRUN = 3 // 00000011
    
    value  = ENABLE_RUN     // 00000001
    value |= ENABLE_SHOOT   // 00000011 or same as ENABLE_SHOOTRUN
    

    When you perform a Bitwise AND with Bitwise NOT of the value you want unset.

    value = value & ~ENABLE_SHOOT // 00000001
    

    you are actually doing:

          0 0 0 0 0 0 1 1     (current value)
       &  1 1 1 1 1 1 0 1     (~ENABLE_SHOOT)
          ---------------
          0 0 0 0 0 0 0 1     (result)
    
    0 讨论(0)
  • 2020-12-12 10:48
    my.emask &= ~(ENABLE_SHOOT);
    

    to clear a few flags:

    my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
    
    0 讨论(0)
提交回复
热议问题