c++ - 设置和重置部分位图

标签 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 方法中重置字段的方法,以确保只采用最后一个值,但我唯一能想到的是:

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

因此从 key 中获取当前值并将其与完整 key 进行异或,以便将所有这些位设置为零。现在,这可行,但对于这样一个看似简单的任务来说似乎很复杂。

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

最佳答案

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

key_ &= ~(mask);

现在掩码中设置的所有位都将被关闭,其余位完好无损。我相信知道您将能够执行您需要的操作。

关于c++ - 设置和重置部分位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345628/

相关文章:

c - (r+1 + (r >> 8)) >> 8 是做什么的?

C++,静态数组,指针,长度

c++ - SetWindowsHookEx 忽略来自消息循环的 PostMessage

c++ - 创建友元函数以访问两个类的私有(private)变量

c++ - 确保内部共享库版本正确

c++ - c++释放对象内存

c++ - 从按位或组合确定原始常数

sql - 如何通过按位运算符操作执行 SQL JOIN?

algorithm - 给定一个无符号整数,获取设置位的 "indexes"的最快方法是什么?

c - 按位移位字符数组