I use them a lot when I'm designing hardware, but I never use them when I'm doing "regular programming", there's no reason to do it if I can use more readable, higher level constructs.
struct header __atribute__((packed)) {
unsigned int highnibble : 4;
unsigned int flag_foo : 1;
unsigned int flag_bar : 1;
unsigned int flag_baz : 1;
unsigned int flag_qux : 1;
}
if (((header)value).flag_bar) {