如何删除C中的标志?


Answers:


339

简短答案

您想对要取消设置标志使用按位非运算对当前值执行按位与运算。按位与不将每个位取反(即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

当您对要设置的值进行按位与运算时,请按位与非。

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)

@Aaron:我很高兴它有所帮助。最初,我很难理解按位操作,直到有人花了10分钟在纸上解释它。
丹尼斯

1
@Dennis我认为XOR可以删除已设置的标志。notification.sound ^= Notification.DEFAULT_SOUND;
likejudo 2014年

3
如何启用步行功能?由于X | 0 == X
Unikorn 2014年

正如@Unikorn指出的那样,无论您尝试对其进行OR运算还是对其进行AND运算,标志值零都无法正常工作。
RenniePet 2014年

要启用步行功能,您只需禁用运行(它将位1设置为0)。不要将ENABLE_ *标志视为十进制数字,而应将其视为二进制数字(打开或关闭)。但是,您仍然不能明确启用或禁用步行。
Jacob Degeling


13

重要的是要注意,如果要操作的变量大于int,则“ and not”表达式中使用的值也必须相同。实际上,有时使用较小的类型可以避免这种情况,但是有很多奇怪的情况,最好使用类型后缀来确保常量足够大。


5
+1用于捕获不明显的拐角处的情况。避免这种情况的一种方法是改为使用flags -= flags & MY_FLAG;(或^=根据需要)。
R .. GitHub停止帮助ICE,2010年

1
@R ..我会使用'^ =',除了它会切换位,有时您可能不知道设置了许多标志中的哪一个。如果我想确保最右边的两位为零,例如my.emask:'0 1 0 1'输入:'0 0 1 1'与:'^ =''0 1 1 0'与:'&〜 '0 1 0 0'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.