Skip to main content

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:

  1. Wenn wir von einer Zweierpotenz 1 subtrahieren, erhalten wir eine Zahl, die alle Bits rechts von der ursprünglichen 1 gesetzt hat
  2. 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