c++ - 我可以在不取消设置以前的值的情况下设置一个位序列吗?

标签 c++ c bit-manipulation

我有一个位序列,比方说

0110 [1011] 1111

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

使用 ANDOR 的位置掩码方法,我似乎别无选择,只能先将原始值取消设置为 0000,因为如果我针对 1011 的原始值尝试 ANDing 或 ORing,我不会得出想要的结果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/

相关文章:

c++ - freopen() 在 Mac 上不起作用

c - 在 C 中将 2D 数组 [x] [y] 作为 1D 数组 [z] 访问

java - Java 中使用否定的位操作

java - 如何比较 RGB 值,忽略 alpha

java - 如何在Java中组合2个字节的位?

c++ - 试图编写一个递归函数来计算总和为该数字的序列数 C++

c++ - 仅将图像的一个区域转换为灰度

c++ - 使用 std::map<K,V> 其中 V 没有可用的默认构造函数

c - 如何在 C 中将 realloc 与双字符指针一起使用?

python - add_swig_library 的 undefined symbol