They have the assumption that you initialized * single_char to some value. Otherwise, the caf decision is published what you need.
(*single_char) = ((*single_char) & 0xF0) | val;
(*single_char) & 11110000 - Resets low 4 bits to 0| val - sets the last 4 bits to a value (provided that val is <16)
If you want to access the last 4 bits, you can use
unsigned char v = (*single_char) & 0x0F;
4 , 4, ..
unsigned char v = (*single_char) & 0xF0;
:
(*single_char) = ((*single_char) & 0x0F) | (val << 4);