いくつかのフラグを保持する変数があり、そのうちの1つを削除したいと思います。しかし、私はそれを削除する方法がわかりません。
これが私がフラグを設定する方法です。
my.emask |= ENABLE_SHOOT;
いくつかのフラグを保持する変数があり、そのうちの1つを削除したいと思います。しかし、私はそれを削除する方法がわかりません。
これが私がフラグを設定する方法です。
my.emask |= ENABLE_SHOOT;
短い答え
設定を解除するフラグのビット単位のNOT演算を使用して、現在の値に対してビット単位のAND演算を実行する必要があります。ビット単位の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より大きい場合は、「not」式で使用される値も同様である必要があることに注意することが重要です。実際には、小さい型を使用することで解決できる場合もありますが、定数が十分に大きいことを確認するために型の接尾辞を使用するのがおそらく最善であるという奇妙なケースが十分にあります。