Если x
равно uint8_t
и val равно uint32_t
, то я бы сделал это
val &= ~(0b111 << 10); // clear current value
val |= (x << 10); // set new value
Обобщение как функция
void overwriteValue(uint32_t * val, uint8_t * x, uint8_t bit_shift, uint8_t bit_mask){
*val &= ~(bit_mask << bit_shift);
*val |= (*x << bit_shift);
}
Пример:
uint32_t my_val = 0xafaf11af; //0b1010111110101111000 100 0110101111
// bits 12, 11, 10
uint8_t x = 0x3;
uint8_t bs = 10;
uint8_t bm = 0x7;
overwriteValue(&my_val, &x, bs, bm);
//my_val = 0xafaf0daf
//0b1010111110101111000 011 0110101111
// bits 12, 11, 10