预先道歉,因为我觉得这个问题微不足道,但我似乎无法理解它,我在网上找到的答案似乎只与设置和重置单个位有关。
我有一个 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 方法中重置字段的方法,以确保只采用最后一个值,但我唯一能想到的是:
key_ ^= ( key_ >> offset_ & mask_ ) << offset_;
因此从 key 中获取当前值并将其与完整 key 进行异或,以便将所有这些位设置为零。现在,这可行,但对于这样一个看似简单的任务来说似乎很复杂。
任何有关如何更有效或更优雅地完成此操作的提示将不胜感激。
最佳答案
关闭给定掩码的位非常容易:
key_ &= ~(mask);
现在掩码中设置的所有位都将被关闭,其余位完好无损。我相信知道您将能够执行您需要的操作。
关于c++ - 设置和重置部分位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345628/