I see no problem with this. In C you can't expect particular order, alignment, or padding of struct or union elements. Bitfields are there to allow saving memory. Having big arrays of small data types it may make sense to use bitfields to save space.
Union is there in C to reuse the same memory to store different types. For example you may have struct, which has two fields, one enum describes data type like char, int, float etc, another field is a union of char/int/float etc.
What you do is some kind of cheating or tricky programming. It is bad practice, at least because your code is not portable and won't work with all compilers and all targets.
You may look in compiler settings. I think there is an option to specify order of bitfields members, which is of no interest to people doing portable programs. Portable would be to use << >> | & operators to extract and put fields into integers or arrays of chars.