いくつかのフラグを保持する変数があり、そのうちの1つを削除したいです。しかし、私はそれを削除する方法がわかりません。
フラグの設定方法は次のとおりです。
my.emask |= ENABLE_SHOOT;
短い答え
ビットごとの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)
my.emask &= ~(ENABLE_SHOOT);
いくつかのフラグをクリアするには:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
操作される変数がintよりも大きい場合、「and not」式で使用される値も同様でなければならないことに注意することが重要です。実際には、小さな型を使用することで回避することもできますが、おそらく定数が十分に大きいことを確認するために型の接尾辞を使用するのが最善の奇妙なケースがあります。