Aaron de Windt
Aaron de Windt

Reputation: 17708

How can I remove a flag in C?

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 |= ENABLE_SHOOT;

Upvotes: 178

Views: 124945

Answers (3)

Dennis
Dennis

Reputation: 20571

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)

Upvotes: 408

supercat
supercat

Reputation: 81179

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.

Upvotes: 16

Ned Batchelder
Ned Batchelder

Reputation: 375634

my.emask &= ~(ENABLE_SHOOT);

to clear a few flags:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);

Upvotes: 106

Related Questions