我可以设置一个位序列而不会取消先前的值吗?

Eng*_*eer 0 c c++ bit-manipulation

比方说,我有一系列的比特

0110 [1011] 1111
Run Code Online (Sandbox Code Playgroud)

假设我想将myddle nybble设置0111为新值.

使用位置遮蔽用的方法AND或者OR,我似乎别无选择,只能先取消设置原值0000,因为如果我试图ANDING或OR荷兰国际集团针对该原始价值1011,我不会出来与期望的结果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;
}
Run Code Online (Sandbox Code Playgroud)

...我相信这会有进一步的改进,但这是(半)可读版本.

Oli*_*rth 7

如果你碰巧知道了这些位的当前值,你可以异或:

  0110 1011 1111
^ 0000 1100 0000

= 0110 0111 1111
Run Code Online (Sandbox Code Playgroud)

(1100需要首先计算当前位和所需位之间的XOR).

当然,这仍然是2个操作.不同之处在于,您可以在某些情况下预先计算第一个异或.

除了这种特殊情况,没有别的办法.您基本上需要表示3种状态:设置为1,设置为0,不要更改.您不能使用单个二进制操作数执行此操作.