web-dev-qa-db-ja.com

Cでフラグを削除するにはどうすればよいですか?

いくつかのフラグを保持する変数があり、そのうちの1つを削除したいです。しかし、私はそれを削除する方法がわかりません。

フラグの設定方法は次のとおりです。

my.emask |= ENABLE_SHOOT;
139
Aaron de Windt

短い答え

ビットごとのAND 現在の値に対して ビットごとのNOT 解除したいフラグの操作を行いたい。ビットごとのNOTは、すべてのビットを反転します(つまり、0 => 1、1 => 0)。

flags = flags & ~MASK;またはflags &= ~MASK;

ロングアンサー

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

設定を解除する値のビット単位NOTでビット単位ANDを実行する場合。

value = value & ~ENABLE_SHOOT // 00000001

あなたは実際にやっている:

      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)
318
Dennis
my.emask &= ~(ENABLE_SHOOT);

いくつかのフラグをクリアするには:

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

操作される変数がintよりも大きい場合、「and not」式で使用される値も同様でなければならないことに注意することが重要です。実際には、小さな型を使用することで回避することもできますが、おそらく定数が十分に大きいことを確認するために型の接尾辞を使用するのが最善の奇妙なケースがあります。

12
supercat