3.4 Bitweise Operatoren
- Aufgabe 1: Schreiben Sie ein Programm, das zwei Zahlen bitweise AND, OR und XOR verknüpft und die Ergebnisse ausgibt.
- Aufgabe 2: Implementieren Sie eine Funktion, die prüft, ob eine gegebene Zahl eine Zweierpotenz ist, unter Verwendung bitweiser Operationen.
Aufgabe 1:
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
int main(void) {
int num1;
int num2;
printf("Zahl 1 eingeben: \n");
scanf("%d", &num1);
printf("Zahl 1 eingeben: \n");
scanf("%d", &num2);
const int numAND = num1 & num2;
const int numOR = num1 | num2;
const int numXOR = num1 ^ num2;
printf("AND = %d \n OR = %d \n XOR = %d \n", numAND, numOR, numXOR);
return 0;
}
Aufgabe 2:
#include <stdbool.h>
#include <stdio.h>
bool checkIfPowerOfTwo (int num);
int main(void) {
int num;
printf("Positive Ganzzahl eingeben: \n");
scanf("%d", &num);
if (checkIfPowerOfTwo(num)) {
printf("Die Zahl %d ist eine Zweierpotenz! \n", num);
return 0;
}
printf("Die Zahl %d ist keine Zweierpotenz! \n", num);
return 1;
}
bool checkIfPowerOfTwo (const int num) {
if (num <= 0) {
return false;
}
return (num & num - 1) == 0;
}
- 2¹ = 2 = 10₂
- 2² = 4 = 100₂
- 2³ = 8 = 1000₂
Diese Lösung nutzt folgenden Trick:
- Wenn wir von einer Zweierpotenz 1 subtrahieren, erhalten wir eine Zahl, die alle Bits rechts von der ursprünglichen 1 gesetzt hat
- Wenn wir diese beiden Zahlen mit AND verknüpfen, muss 0 herauskommen, wenn es eine Zweierpotenz war
Beispiel für 8 (1000₂):
- 8 = 1000₂
- 8-1 = 0111₂
- 8 & 7 = 0000₂
Für Ihre Beispielzahl 1293:
- 1293 = 10100001101₂
- 1292 = 10100001100₂
- 1293 & 1292 ≠ 0
Daher wird 1293 korrekt als Nicht-Zweierpotenz erkannt