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)
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'表达式中使用的值也必须如此.实际上,人们有时可以使用较小的类型,但有足够奇怪的情况,最好使用类型后缀来确保常量足够大.