166

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

これが私がフラグを設定する方法です。

my.emask |= ENABLE_SHOOT;
4

3 に答える 3

373

短い答え

設定を解除するフラグのビット単位の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)
于 2010-10-13T02:41:21.373 に答える
95
my.emask &= ~(ENABLE_SHOOT);

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

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
于 2010-10-13T02:03:38.240 に答える
14

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

于 2010-10-16T07:25:10.050 に答える