die gewünschte kapselung kann man in c mit struct erreichen:

Code:
struct meinestruktur
  {
  unsigned int bit1 : 1;
  unsigned int bit2 : 1;
  unsigned int bit3 : 1;
  unsigned int bit4 : 1;
  unsigned int bit5 : 1;
  };

int main() {
...
struct meinestruktur daten;

daten.bit1=1;
daten.bit2=0;

}
die sache hat allerdings nen haken: es kommt auf den compiler bzw. dessen einstellungen an, ob die bits dann wirklich als bits in einem datenbyte gespeichert werden.
prinzipiell darf der compiler auch jedes bit in ein eigenes byte, oder int oder sonstwas speichern. daran ändert aber auch c++ nichts.

du kannst dir natürlich so ne struktur definieren und dazu ne passende funktion, um die daten dann wirklich in die richtige position eines byte zu schreiben. wenns um hardware geht, muss man letztlich immer auf etwas umständliche methoden zzurückgreifen, wenn man in ner hochsprache programmiert (zumindest wenn der code portabel bleiben soll)

der gnu compiler avr-gcc unterstützt einige c++ möglichkeiten (siehe doku). damit kann man sicher das ein oder andere eleganter formulieren als in reinem c. aber an der tatsache, dass du dir bei hardwarezugriff genau anschauen musst, welchen maschinencode dein hochsprachencompiler letztlich erzeugt, kommst du nicht drum rum.
(das kann natürlich schon jemand in irgend ner bibliothek für dich erledigt haben, aber genau hinschauen sollte man trotzdem mal, bevor man so ne bibliothek verwendet)