I think this should work. However I've only tested it lightly.
int start_bit = 10; int bit_count = 9;
uint8_t setbit[2] = { 0b11110010, 0b00000001 };
int setbit_size = (bit_count + (CHAR_BIT - 1)) / CHAR_BIT;
int start_byte = start_bit / CHAR_BIT;
int shift = start_bit % CHAR_BIT;
int modified_bytes =
bit_count ? (bit_count + shift + (CHAR_BIT - 1)) / CHAR_BIT : 0;
for (int i = 0; i < modified_bytes; ++i) {
uint8_t mask = 0xFF;
if (i == 0) {
mask <<= shift;
} else if (i == modified_bytes - 1) {
mask >>= CHAR_BIT - (bit_count + shift) % CHAR_BIT;
}
uint8_t carried = i > 0 ? (setbit[i - 1] >> (CHAR_BIT - shift)) : 0;
uint8_t added = i < setbit_size ? static_cast<uint8_t>(setbit[i] << shift) : 0;
memory[start_byte + i] =
(memory[start_byte + i] & ~mask) | ((carried | added) & mask);
}