Yes, I completely agree (and I think that has been said in full in this thread). However, there is little or no difference in efficiency between the "DIY" solution and the compiler provided solution for bitfields.
So the benefit of using a code using and, or and shift operators over bitfields is the portability aspect - the compiler will still have to do the same and/or/shift operations in a bitfield - and it may even be slightly better at understanding what goes on.
The code is only poor compared to individual "architecture friendly" members of a structure - e.g. in most machines, a byte, 16-bit word or 32-bit word is easy to access. But if you really insist on storing 1, 3 or 7 and 5 bits in a 16-bit word, then you will need a set of shift/and/or operations to modify the value - regardless of what the code to do that looks like.
And neither solution provides any built-in protection in the cases regarding multiple processes/thread when accessing shared data - that is exactly the same for other operations that modify data which can be accessed from multiple threads or processes - but bitfields may be slightly more difficult to identify, as it looks like one simple access.