Давайте рассмотрим более общую проблему: у вас есть двоичное число a , и вы хотите заменить его биты на биты другого числа b , только когда соответствующий бит третьегочисло m равно единице.
Для вашей конкретной задачи:
a = 1001100
b = xx1011x
m = 0011110
, но нет необходимости, чтобы m соответствовал одному диапазону.
Псевдокод для вычисления результата r будет
for all i in 0 to 6
if m[i]=1
r[i]=a[i]
else
r[i]=b[i]
или эквивалентно
for all i in 0 to 6
r[i] = (a[i] and (m[i]=1)) or (b[i] and (m[i]=0))
Из этого легко сделать вывод, чтоцикл бесполезен, и выражение
r = (a & m) | (b & ~m)
дает правильный результат.
Обратите внимание, что если вы хотите произвести замену в определенном диапазоне k to l (например, от 1 до 5 в вашем случае), маска будет (2 ^ l - 1) - (2 ^ k - 1) = 2 ^ l - 2 ^ k
Так вот соответствующий код C
unsigned int replace_bit(unsigned int a, unsigned int b, int k, int l){
unsigned int mask=(1<<l) - (1<<k)
return (a & mask) | (b & ~mask) ;
}