Kapitel 7 Unit 35 von 36 Theorie + Übungen Dauer: ~100 Min.
Ömer
Ömer sagt:

Bitoperatoren klingen erstmal komisch – aber sobald du verstehst wie Bits funktionieren, öffnet sich eine ganz neue Welt! Embedded, Netzwerk, Grafik – überall stecken Bits dahinter. Los geht's!

Binär rechnen AND / OR / XOR anwenden Shift-Operatoren verstehen Bit-Masken einsetzen Flags in C programmieren
Übung 1 – Binär rechnen

Umrechnung und Bitoperationen per Hand

Rechne zuerst die Zahlen in Binär um, dann führe die Operationen durch:

DezimalBinär (8 Bit)
12
7
255

Berechne nun die folgenden Ausdrücke – zuerst binär, dann als Dezimalzahl:

AusdruckBinär-RechnungErgebnis (dez.)
12 & 7
12 | 7
12 ^ 7
Schreibe beide Zahlen untereinander und vergleiche Bit für Bit: AND = 1 nur wenn BEIDE 1 sind; OR = 1 wenn mind. eines 1 ist; XOR = 1 wenn genau eines 1 ist.
Übung 2 – Shift-Operatoren

Verschiebungen per Hand berechnen

Berechne die folgenden Shift-Ausdrücke. Schreibe auch das Muster das du erkennst:

AusdruckErgebnisEntspricht
3 << 2
16 >> 3
1 << 7
100 >> 2

Welches Muster erkennst du bei Links-Shift? Und bei Rechts-Shift?

Links-Shift um n = Multiplikation mit 2^n. Rechts-Shift um n = Integer-Division durch 2^n.
Übung 3 – Flags

Berechtigungsflags mit Bitoperatoren

Gegeben sind folgende Defines:

C
#define LESEN      1   // Bit 0
#define SCHREIBEN  2   // Bit 1
#define AUSFUEHREN 4   // Bit 2

Schreibe ein vollständiges Programm das:

  1. Eine Variable rechte auf 0 setzt
  2. Alle drei Flags mit |= setzt
  3. Jeden einzelnen Flag mit & prüft und ausgibt ob er gesetzt ist
  4. SCHREIBEN mit &= ~SCHREIBEN löscht
  5. Nochmal alle Flags prüft und ausgibt
#include <stdio.h> #define LESEN 1 #define SCHREIBEN 2 #define AUSFUEHREN 4 int main() { unsigned int rechte = 0; /* 1. Alle Flags setzen */ /* 2. Flags prüfen und ausgeben */ printf("Lesen: %s\n", (rechte & LESEN) ? "JA" : "NEIN"); /* 3. SCHREIBEN löschen */ /* 4. Nochmal alle Flags ausgeben */ return 0; }
Nach dem Setzen aller drei Flags hat rechte den Wert 7 (= 111 in binär). Nach dem Löschen von SCHREIBEN sollte es 5 (= 101) sein.
Übung 4 – Gerade/Ungerade

Funktion ist_gerade() mit Bitoperator

Schreibe die Funktion ist_gerade(int n) die nur den &-Operator verwendet (kein %!). Teste sie mit mindestens 10 verschiedenen Zahlen:

#include <stdio.h> /* Gibt 1 zurück wenn n gerade, 0 wenn ungerade */ /* NUR &-Operator erlaubt! */ int ist_gerade(int n) { } int main() { int zahlen[] = {0, 1, 2, 7, 8, 13, 100, 255, -4, -7}; int anzahl = 10; for (int i = 0; i < anzahl; i++) { printf("%4d ist %s\n", zahlen[i], ist_gerade(zahlen[i]) ? "gerade" : "ungerade"); } return 0; }
Das letzte Bit einer Zahl ist 1 wenn sie ungerade ist, 0 wenn sie gerade ist. Prüfe es mit n & 1.
Übung 5 – Programm

RGB-Farbmischer

Schreibe ein Programm das:

  1. R, G, B als int-Werte (0–255) einliest
  2. Die drei Werte in einen einzigen unsigned int packt: rgb = (r<<16) | (g<<8) | b
  3. Den Hex-Wert ausgibt (wie #FF8000)
  4. Den Wert wieder entpackt und die drei Einzelwerte ausgibt zur Überprüfung
SHELL
Rot   (0-255): 255
Gruen (0-255): 128
Blau  (0-255): 0
Farbe: #FF8000
Entpackt: R=255 G=128 B=0
#include <stdio.h> int main() { unsigned int r, g, b; printf("Rot (0-255): "); scanf("%u", &r); printf("Gruen (0-255): "); scanf("%u", &g); printf("Blau (0-255): "); scanf("%u", &b); /* Farbe packen */ unsigned int rgb = /* ? */; /* Hex ausgeben */ printf("Farbe: #%06X\n", rgb); /* Entpacken mit >> und & 0xFF */ unsigned int rot = /* ? */; unsigned int gruen = /* ? */; unsigned int blau = /* ? */; printf("Entpackt: R=%u G=%u B=%u\n", rot, gruen, blau); return 0; }
Entpacken: (rgb >> 16) & 0xFF liefert den Rot-Anteil. 0xFF ist eine Maske für die untersten 8 Bits.
Bonus

Binärdarstellung ausgeben

Schreibe die Funktion drucke_binaer(unsigned int n) die eine beliebige Zahl in ihrer 32-Bit-Binärdarstellung ausgibt. Nutze nur Bit-Shifting und Masken (kein printf("%b") – das gibt es in Standard-C nicht!).

SHELL
drucke_binaer(42):
00000000 00000000 00000000 00101010

drucke_binaer(255):
00000000 00000000 00000000 11111111
#include <stdio.h> void drucke_binaer(unsigned int n) { /* Schleife von Bit 31 bis Bit 0 */ for (int i = 31; i >= 0; i--) { /* Bit i prüfen und '1' oder '0' ausgeben */ /* Nach jedem 8. Bit ein Leerzeichen */ if (i % 8 == 0 && i != 0) printf(" "); } printf("\n"); } int main() { printf("drucke_binaer(42):\n"); drucke_binaer(42); printf("drucke_binaer(255):\n"); drucke_binaer(255); printf("drucke_binaer(1 << 16):\n"); drucke_binaer(1 << 16); return 0; }
Prüfe Bit i mit (n >> i) & 1 – das verschiebt Bit i an Position 0 und maskiert alle anderen weg.