没有位掩码的零特定位?

  • 本文关键字:定位 掩码 c
  • 更新时间 :
  • 英文 :


我想设置一个特定的位为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;
}

还要确保你要移动的常量是正确的类型,这样你就不会移动到有符号类型的符号位或超过所讨论类型的位宽。

最新更新