我有一个位序列,比方说
0110 [1011] 1111
假设我想将 myddle nybble 设置为 0111
作为新值。
使用 AND
或 OR
的位置掩码方法,我似乎别无选择,只能先将原始值取消设置为 0000
,因为如果我针对 1011
的原始值尝试 AND
ing 或 OR
ing,我不会得出想要的结果0111
。
我应该使用另一个逻辑运算符来获得预期的效果吗?还是我每次都被锁定在 2 个操作中?
善意协助后的结果是:
inline void foo(Clazz* parent, const Uint8& material, const bool& x, const bool& y, const bool& z)
{
Uint8 offset = x | (y << 1) | (z << 2); //(0-7)
Uint64 positionMask = 255 << offset * 8; //255 = length of each entry (8 bits), 8 = number of bits per material entry
Uint64 value = material << offset * 8;
parent->childType &= ~positionMask; //flip bits to clear given range.
parent->childType |= value;
}
...我相信这会得到进一步改进,但这是(半)可读版本。
最佳答案
如果您碰巧已经知道这些位的当前值,您可以异或:
0110 1011 1111
^ 0000 1100 0000
= 0110 0111 1111
(其中 1100
需要首先计算为当前位和所需位之间的异或)。
当然,这还是2个操作。不同之处在于,您可以在某些情况下预先计算第一个 XOR。
除了这个特例,别无他法。您基本上需要表示 3 种状态:设置为 1、设置为 0、不更改。您不能使用单个二进制操作数执行此操作。
关于c++ - 我可以在不取消设置以前的值的情况下设置一个位序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141583/