gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:00 25 4
gpt4 key购买 nike

我有一个位序列,比方说

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com