如何删除 C 中的标志?

问题描述 投票:0回答:4

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

这是我设置标志的方法。

my.emask |= ENABLE_SHOOT;
c bit-manipulation flags
4个回答
399
投票

简短回答

您想要对当前值执行按位与运算,并对要取消设置的标志进行按位非运算。按位 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

当您对要取消设置的值执行按位与和按位非时。

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)
    

102
投票
my.emask &= ~(ENABLE_SHOOT);

清除一些标志:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
    

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


0
投票
简单的答案就是这个,它比其他建议的操作更少。

my.emask ^= ENABLE_SHOOT;
您也可以执行此操作,禁用多个

my.emask ^= (ENABLE_SHOOT | OTHER | OTHER2);
    
© www.soinside.com 2019 - 2024. All rights reserved.