Предполагается, что вы инициализировали * single_char некоторым значением.В противном случае опубликованное решение caf делает то, что вам нужно.
(*single_char) = ((*single_char) & 0xF0) | val;
(*single_char) & 11110000
- Сбрасывает младшие 4 бита в 0 | val
-- Устанавливает последние 4 бита в значение (при условии, что val <16) </li>
Если вы хотите получить доступ к последним 4 битам, вы можете использовать unsigned char v = (*single_char) & 0x0F;
Если вы хотите получить доступстаршие 4 бита вы можете просто сдвинуть маску на 4, т.е.
unsigned char v = (*single_char) & 0xF0;
и установить их:
(*single_char) = ((*single_char) & 0x0F) | (val << 4);