Как уже упоминал Томалак Гареткал, это особенность ANSI C, называемая битовыми полями. Статья в Википедии весьма полезна. Обычно вы объявляете их как структуры.
Для вашего примера: как вы упомянули, у вас есть одно число в диапазоне 0..5, вы можете использовать 3 бита для этого числа, что оставляет вам 5 битов использования:
struct s
{
unsigned int mynumber : 3;
unsigned int myother : 5;
}
Теперь они могут быть доступны просто так:
struct s myinstance;
myinstance.mynumber = 3;
myinstance.myother = 1;
Имейте в виду, что битовые поля на медленнее , чем обычные элементы / переменные структуры, поскольку среда выполнения должна выполнять сдвиг / маскирование битов, чтобы обеспечить доступ к простым битам.