如何删除C中的标志?

Aar*_*ndt 142 c flags bit-manipulation

有一个变量,它包含一些标志,我想删除其中一个.但我不知道如何删除它.

这是我如何设置标志.

my.emask |= ENABLE_SHOOT;
Run Code Online (Sandbox Code Playgroud)

Den*_*nis 328

简答

您希望使用要取消设置标志按位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
Run Code Online (Sandbox Code Playgroud)

当你想要取消设置的值执行按位与按位NOT时.

value = value & ~ENABLE_SHOOT // 00000001
Run Code Online (Sandbox Code Playgroud)

你实际上是这样做的:

      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)
Run Code Online (Sandbox Code Playgroud)

  • 你如何启用Walk?由于X | 0 == X. (3认同)

Ned*_*der 79

my.emask &= ~(ENABLE_SHOOT);
Run Code Online (Sandbox Code Playgroud)

清除一些旗帜:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Run Code Online (Sandbox Code Playgroud)


sup*_*cat 12

重要的是要注意,如果被操作的变量大于int,那么'and not'表达式中使用的值也必须如此.实际上,人们有时可以使用较小的类型,但有足够奇怪的情况,最好使用类型后缀来确保常量足够大.

  • +1用于捕捉不明显的角落案例.避免它的一种方法是改为使用`flags - = flags&MY_FLAG;`(或者如果你愿意,可以使用`^ =`). (5认同)
  • @R..我会使用“^=”,除非它会切换位,有时您可能不知道设置了哪些标志。如果我想确保最右边的两个位为零,例如 my.emask: '0 1 0 1' input: '0 0 1 1' with: '^=' '0 1 1 0' with: '& ~ ''0 1 0 0' (2认同)