Собирайте биты, пока у вас не будет достаточно битов для заполнения байта, а затем запишите его.
например. как то так:
int current_bit = 0;
unsigned char bit_buffer;
FILE *f;
void WriteBit (int bit)
{
if (bit)
bit_buffer |= (1<<current_bit);
current_bit++;
if (current_bit == 8)
{
fwrite (&bit_buffer, 1, 1, f);
current_bit = 0;
bit_buffer = 0;
}
}
Как только вы закончите писать свои биты, вы должны очистить битовый буфер. Для этого просто пишите биты, пока current_bit не станет равным нулю:
void Flush_Bits (void)
{
while (current_bit)
WriteBit (0);
}