设置和重置位图的部分

时间:2014-04-28 15:52:15

标签: c++ bit-manipulation

前面道歉,因为我觉得这个问题很简单,但我似乎无法理解它,我在网上找到的答案似乎只关心设置和重置单个位。

我有一个32位数字,用于存储多个信息字段。 这样做的方法是定义各种偏移和掩模,例如,

uint32_t          key_;
static const uint16_t offset_  = 10; // example field, key uses all 32 bits
static const uint16_t mask_    = 0x1FF;

设置在以下方法中完成:

void setField( unsigned int rhs ) { key_ |= ( rhs << offset_ ); } 

或提取

unsigned int getField() { return ( key_ >> offset_ ) & mask_; }

所有这一切都很好,只要我不需要在相关字段中设置新值。如果我设置了一个新值,我需要先删除该字段的所有位(并且只删除那些),因为当然:

key |=  10 << offset_; // followed by
key |=  16 << offset_;

key_ >> offset_ & mask_; // = 26 and not 16

现在,我正在寻找的是首先在setter方法中重置字段的方法,以确保只采用最后一个值,但我唯一能想到的就是:< / p>

key_ ^= ( key_ >> offset_ & mask_ ) << offset_;

所以从密钥中获取当前值并使用完整密钥对其进行异或,以便将所有这些位设置为零。现在,这有效,但看起来似乎很复杂。

有关如何更有效或更优雅地完成此任务的任何提示将不胜感激。

1 个答案:

答案 0 :(得分:2)

关闭给定掩码的位非常容易:

key_ &= ~(mask);

现在掩码中设置的所有位都将被关闭,其余位完好无损。我相信知道你将能够满足你的需求。