У меня есть последовательность битов, скажем
0110 [1011] 1111
Допустим, я хочу установить для этого myddle nybble значение 0111
в качестве нового значения.
Использование позиционной маскировкиПриближаясь к AND
или OR
, мне кажется, что у меня нет выбора, кроме как сначала сбросить исходное значение на 0000
, потому что если я пытаюсь AND
использовать или 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;
}
... Я уверен, что это увидит дальнейшее улучшение, но этоявляется (полу) читаемой версией.