前面道歉,因为我觉得这个问题很简单,但我似乎无法理解它,我在网上找到的答案似乎只关心设置和重置单个位。
我有一个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_;
所以从密钥中获取当前值并使用完整密钥对其进行异或,以便将所有这些位设置为零。现在,这有效,但看起来似乎很复杂。
有关如何更有效或更优雅地完成此任务的任何提示将不胜感激。
答案 0 :(得分:2)
关闭给定掩码的位非常容易:
key_ &= ~(mask);
现在掩码中设置的所有位都将被关闭,其余位完好无损。我相信知道你将能够满足你的需求。