Why not use: x = !x;?

It's down to how the processor works and assembly code but in general after every operation a set of status bits tells us useful details about what happened like was the high bit set, T/F, or was a bit carried, T/F, all in a register (AVR is 8-bit).

With AVR I use type byte ( uint8_t) or byte arrays. A byte operates on 8 bools at once.
You can read a port PINx register to get many pin states at once.