我想设置一个特定的位为0,但不使用位掩码,因为我使用枚举,如果枚举值改变,枚举字段被移动,那么位掩码将不再有效。
我可以打开一个位,使用一个临时变量,然后用它与已经存在的位域
#include <assert.h>
enum EState{
k_EStateNone,// bit 1 - 1
k_EStateFoo,// bit 2 - 10
k_EStateBar// bit 3 - 100
};
uint64_t togglebiton(uint64_t state,EState ebit){
uint64_t temp = 1<<ebit;
state|=temp;
return state;
}
int main(){
uint64_t state = 0;
state = togglebiton(state, k_EStateBar);
state = togglebiton(state, k_EStateFoo);
//foo bar = 110 == 6
assert(state == 6);
return 0;
}
但我不确定如何去翻转位,因为我不能和整个东西与0..
要翻转一个位,首先将该位移位到所需的位置,然后使用按位NOT反转所有位,以便设置除目标位外的所有位,然后执行按位AND操作。
uint64_t togglebitoff(uint64_t state,EState ebit){
uint64_t temp = 1ULL<<ebit;
state&=~temp;
return state;
}
还要确保你要移动的常量是正确的类型,这样你就不会移动到有符号类型的符号位或超过所讨论类型的位宽。