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)
...我相信这会有进一步的改进,但这是(半)可读版本.
如果你碰巧知道了这些位的当前值,你可以异或:
0110 1011 1111
^ 0000 1100 0000
= 0110 0111 1111
Run Code Online (Sandbox Code Playgroud)
(1100需要首先计算当前位和所需位之间的XOR).
当然,这仍然是2个操作.不同之处在于,您可以在某些情况下预先计算第一个异或.
除了这种特殊情况,没有别的办法.您基本上需要表示3种状态:设置为1,设置为0,不要更改.您不能使用单个二进制操作数执行此操作.
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |