Как перезаписать N битов в определенной позиции без перезаписи остальных в Qt
У меня появилась проблема при перезаписи уже установленных битов на определенных позициях. Не могу найти решение, как перезаписывать N битов, которые уже были установлены на 1.
Для наглядности проблемы, я написал примерную реализацию того, что я делаю у себя.
int main(int argc, char *argv[])
{
quint32 val = 0;
val |= ((0 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 00000000000000000000000000000000
// Should get : 00000000000000000000000000000000
val |= ((1 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 01000000000000000000000000000000
// Should get : 01000000000000000000000000000000
val |= ((2 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 11000000000000000000000000000000
// Should get : 10000000000000000000000000000000
val |= ((3 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 11000000000000000000000000000000
// Should get : 11000000000000000000000000000000
val |= ((2 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 11000000000000000000000000000000
// Should get : 10000000000000000000000000000000
val |= ((1 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 11000000000000000000000000000000
// Should get : 01000000000000000000000000000000
val |= ((0 & 0x03) << 0x1E);
qDebug() << QString("%1").arg(val, 32, 2, QChar('0'));
// I get : 11000000000000000000000000000000
// Should get : 00000000000000000000000000000000
}
Меня интересует именно реализация кода таким образом, чтобы при установки значений для определенных битов, не производилось затрагивание состояние битов не относящихся к установке значений. Я заметил, что если определенный бит был выставлен на значение 1 - то при перезаписи, я не могу установить его в 0.
Например, если в quint32, с 0 бита по 7, я хочу установить максимальное значение - 127, то при уменьшение этого значения, например на 8, я всеравно получаю 127.
Ответы (1 шт):
Не могу найти решение, как перезаписывать N битов, которые уже были установлены на 1.
Сначала надо обнулить биты AND'ом, а потом присваивать им значение OR'ом:
val = (val & ~(0x03 << 30)) | (high_bits << 30)
/* 0x3fffffff */
Для произвольной группы битов это будет выглядеть как-то так:
int bit_sz = 0x02; //< размер битового поля
int bit_offset = 0x30; //< смещение битового поля от младший битов
int bit_mask = ~(~0 << bit_sz) << bit_offset; //< маска битового поля, 0xc0000000
val = (val & ~bit_mask) | new_bit_val << bit_offset