HOWTO · C

Bitweise Schiebeoperationen in C verwenden

Dieser Artikel demonstriert die Verwendung von bitweisen Schiebeoperationen in C

In diesem Artikel werden verschiedene Methoden zur Verwendung von bitweisen Verschiebeoperationen in C erklärt.

Bitweise Schiebeoperationen sind Bestandteil jeder Programmiersprache und verschieben jedes Bit eines Integer-Operanden um die angegebene Anzahl von Stellen. Um die Auswirkungen dieser Operationen besser zu demonstrieren, haben wir in den folgenden Beispielen die Funktion namens binary eingefügt, die die binäre Darstellung für die gegebene Ganzzahl ausgibt. Beachten Sie, dass diese Funktion nur für 32-Bit-Integer-Werte implementiert ist. Der folgende Beispielcode demonstriert die Linksverschiebung um zwei Stellen und gibt die Zahlendarstellungen entsprechend aus.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n1 = 123;

  binary(n1);
  printf(" : %d\n", n1);
  n1 <<= 2;
  binary(n1);
  printf(" : %d\n", n1);

  exit(EXIT_SUCCESS);
}

Ausgabe:

00000000000000000000000001111011 : 123
00000000000000000000000111101100 : 492

Linksverschiebung zum Multiplizieren von Integer-Werten um zwei in C verwenden

Wir können die Linksschiebe-Operation verwenden, um die Multiplikation mit zwei zu implementieren, was auf der Hardware effizienter sein kann. Beachten Sie, dass es bei der Linksverschiebung keinen Unterschied zwischen der arithmetischen und der logischen Verschiebung gibt. Die einfache Positionsverschiebung für die gegebene ganze Zahl ergibt eine Multiplikation; wir können also weiter verschieben, um die Multiplikation entsprechend zu erhalten.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n1 = 123;

  printf("%d\n", n1);
  n1 <<= 1;
  printf("%d x2\n", n1);

  exit(EXIT_SUCCESS);
}

Ausgabe:

492
984 x2

Rechtsverschiebung - Unterschied zwischen arithmetischer und logischer Verschiebung in C

Es sollte erwähnt werden, dass vorzeichenlose und vorzeichenbehaftete Ganzzahlen unter der Haube unterschiedlich dargestellt werden. Vorzeichenlose Zahlen sind als Zweierkomplementwerte implementiert. Folglich ist das höchstwertige Bit negativer Zahlen 1, das sogenannte Vorzeichenbit, während positive Ganzzahlen wie üblich mit 0 beginnen. Wenn wir also die negativen Zahlen logisch nach rechts verschieben, verlieren wir ihr Vorzeichen und erhalten die positive ganze Zahl. Wir müssen also zwischen logischen und arithmetischen Verschiebungen unterscheiden, wobei bei letzteren das höchstwertige Bit erhalten bleibt. Obwohl es einen Unterschied zwischen den Konzepten gibt, stellt C keine separaten Operatoren zur Verfügung. Außerdem spezifiziert der C-Standard das Verhalten nicht, da es von der Hardware-Implementierung bestimmt wird. Wie die folgende Beispielausgabe zeigt, hat die zugrunde liegende Maschine die arithmetische Verschiebung durchgeführt und den negativen Wert der Ganzzahl erhalten.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n2 = -24;

  binary(n2);
  printf(" : %d\n", n2);
  n2 >>= 3;
  binary(n2);
  printf(" : %d\n", n2);

  exit(EXIT_SUCCESS);
}

Ausgabe:

11111111111111111111111111101000 : -24
11111111111111111111111111111101 : -3