а) тип int -- знаковый, а значит, поле int i:1; шириной 1 бит содержит в себе два значения -- ноль и... минус единицу. Нужно использовать unsigned int.
б) написать структуру, похожую на битовую, недостаточно. Нужно чтобы реально была указана битность:
struct A
{
unsigned int bit0;
unsigned int bit1;
unsigned int bit2;
unsigned int bit3;
unsigned int bit4;
unsigned int bit5;
unsigned int bit6;
unsigned int bit7;
};
эта штука занимает 8 БАЙТ и не содержит в себе битовых полей. Нужно добавить :1 после каждого имени. На этом попался опытный специалист прямо у меня на глазах.