The bit notation expresses more what you want
I'm not seeing the picture (or less poetically the code) here. If I want to set a specific bit then I agree the above bitpacked record syntax makes it very clear what is meant. What I don't understand is the use case where I want to set more than one bit in one statement, it seems to me that I need to revert to OR'ing bit shifts together to construct a byte which then is assigned to a byte variable.
Yes. For arbitrary values. If most bits are boolean though, you might make it readable simply by having masks rather than shifts. The PIC32 (Microchip XC16) headers define it simply all. So both the bitpacked records, _POSITION for shift values and _MASK for the corresponding mask. (1 shl xx)
The bits registers on all microchip systems have -bits suffixed, and the straight name is reserved for the as a whole integer (byte,word,dword, depending on arch) register.
ADCSRAbits.ADPS0=1; // not atomic on PIC32, atomic on PIC8/dspic
ADCSRA= yy; // sets to 00010000 or whatever.
ADCSRASET = yy ; // atomic set on PIC32, sets to xxx1xxxx
ADCSRACLR = yy; // atomic clear on PIC32, sets to xxx0xxxx
where yy = 1 shl ADPS0_POSITION or yy = ADPS0_MASK would all work. Combinations too.
The SET and CLR options are an architecture feature. These registers have a different address.