Bitweise Schiebeoperationen in C verwenden

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie den << Operator, um die Zahl in C nach links zu verschieben
  2. Linksverschiebung zum Multiplizieren von Integer-Werten um zwei in C verwenden
  3. Rechtsverschiebung - Unterschied zwischen arithmetischer und logischer Verschiebung in C
Bitweise Schiebeoperationen in C verwenden

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook