Arten von Schichtoperatoren in C

Luqman Khan 15 Februar 2024
  1. Schichtoperatoren in C
  2. Arten von Schichtoperatoren in C
  3. Abschluss
Arten von Schichtoperatoren in C

In diesem Artikel werden wir die Shift-Operatoren verstehen, die die Arten von bitweisen Operatoren sind, die an den Bits der Werte von Variablen ausgeführt werden. Es gibt zwei Arten von Verschiebungsoperatoren: den linken Verschiebungsoperator und den rechten Verschiebungsoperator.

Werfen wir einen Blick auf diese Operatoren.

Schichtoperatoren in C

Der linke Shift-Operator ist durch das <<-Symbol und der rechte Shift-Operator durch das >>-Symbol gekennzeichnet. Diese Operatoren sind binär und erfordern zwei Operanden auf beiden Seiten von Operatoren, und beide müssen ganze Zahlen sein.

Die Syntax des arithmetischen Operators für die Rechtsverschiebung ist unten angegeben:

n >> m ;

Wir verschieben den Wert in n um m Bits nach rechts. Dabei sind n und m ganze Zahlen.

Arten von Schichtoperatoren in C

Es gibt nur einen Rechtsverschiebungsoperator >> in C. C-Compiler wählen aus, welche Rechtsverschiebung verwendet wird, je nachdem, welche Art von Ganzzahl verschoben wird.

Die arithmetische Verschiebung wird verwendet, wenn vorzeichenbehaftete Ganzzahlen verschoben werden, und vorzeichenlose Ganzzahlen werden unter Verwendung der logischen Verschiebung verschoben.

In beiden Fällen erfolgt die logische Verschiebung für die vorzeichenlose Links- oder Rechtsverschiebung, aber wir können die logische Verschiebung nicht im Fall eines vorzeichenbehafteten ganzzahligen Werts verwenden. Die logische Verschiebung kann das Vorzeichen ändern, also können wir die arithmetische Verschiebung verwenden, um dieses Problem zu beseitigen.

Bei der rechten arithmetischen Verschiebung wird also das MSB (Vorzeichenbit) kopiert und nach rechts verschoben. Der Effekt ist, durch zwei zu teilen.

Die Syntax für vorzeichenbehaftete Zahlen:

n1=-n2;

n1>>m1;

Speichern Sie im Fall einer vorzeichenbehafteten Ganzzahl das erste Bit in einem leeren Slot und verschieben Sie die Kopie während des Verschiebens zum nächsten.

Arithmetische und logische Linksverschiebungen sind gleich. Bei negativen Werten unterscheiden sich nur die Rechtsverschiebungen.

Daher sind Programme, die bei vorzeichenbehafteten Werten richtige Verschiebungen vornehmen, von Natur aus nicht portierbar.

Beim Verschieben eines Werts nach rechts um n Bits wird der Wert durch 2, erhöht auf n, geteilt, und beim Verschieben des Werts nach links um n Bits wird der Wert mit 2 multipliziert, potenziert mit n .

Beispielcode:

#include <stdio.h>

int main(void) {
  int dd = -15;
  int ee = 15;
  printf("value of  dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
  printf("value of  dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
  printf("value of  dd right shift(sign  bit) by 3 bits, is %d\n", dd >> 3);
  printf("value of  dd right shift by 4 bits, is %d\n", dd >> 4);
  printf("value of  ee right shift by 1 bits, is %d\n", ee >> 1);
  printf("value of  ee right shift by 2 bits, is %d\n", ee >> 2);
  printf("value of  ee right shift by 3 bits, is %d\n", ee >> 3);
  return 0;
}

Im obigen Beispielcode in C verwenden wir #include <stdio.h> als Bibliotheks-Header-Datei, die Informationen zum Einschließen der Eingabe- oder Ausgabefunktionen wie printf() und scanf() Funktionen in unserem Programm.

Die Funktion main ist der Ausgangspunkt der Programmausführung. Das Betriebssystem leitet die Programmausführung ein, indem es die Funktion main aufruft.

Die folgenden beiden Variablen dd und ee werden mit zwei unterschiedlichen Vorzeichenwerten, positiv und negativ, initialisiert. Dann erfolgt der Verschiebevorgang in der Funktion printf() einfach um 1, 2 bzw. 3 Zahlen und das gleiche mit dem Vorzeichenwert ee.

Wenn eine arithmetische Verschiebung nach rechts an einer negativen Zahl durchgeführt wird, wird das Vorzeichenbit verschoben und in die während des Verschiebens erzeugten leeren Schlitze kopiert, wie im obigen Beispiel. Beide Werte werden für die angegebenen Zeiten nach rechts verschoben, vorzeichenbehaftete und vorzeichenlose Zahlen.

Bei der vorzeichenlosen Zahl ist die Verschiebung logisch. Er wird in der Variable ee dargestellt, die einen Wert 15 enthält, der um 1 Bit, 2 Bit und 3 Bit nach rechts verschoben ist.

Es zeigt, dass das Teilen des Werts durch 2 die Potenz einer Zahl (Bit) erhöht, z. B. das Verschieben um 1 Bit ist 15/2^1, was 7 entspricht.

Beim Verschieben von vorzeichenbehafteten Werten kopiert sich der Wert des ersten Bits selbst zum Verschieben und speichert ihn während des Verschiebens in einem leeren Schlitz.

Ausgang:

Rechtsverschiebung - Ausgabe

Die Rechtsverschiebung für vorzeichenlose und vorzeichenbehaftete Werte ist einfach; die freien Bits werden mit Nullen aufgefüllt. Bei negativen Werten ist das Ergebnis der Rechtsverschiebung implementierungsdefiniert.

Wir werden im folgenden Beispiel eine gerade Zahl verwenden, um die Ergebnisse zu sehen und die Funktionsweise des rechten Verschiebungsoperators in geraden und ungeraden vorzeichenbehafteten Zahlen zu verstehen. Sehen wir uns den unten angegebenen Code an.

#include <stdio.h>

int main(void) {
  int dd = -16;
  int ee = 16;
  printf("value of  dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
  printf("value of  dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
  printf("value of  dd right shift(sign  bit) by 3 bits, is %d\n", dd >> 3);
  printf("value of  dd right shift by 4 bits, is %d\n", dd >> 4);
  printf("value of  ee right shift by 1 bits, is %d\n", ee >> 1);
  printf("value of  ee right shift by 2 bits, is %d\n", ee >> 2);
  printf("value of  ee right shift by 3 bits, is %d\n", ee >> 3);
  return 0;
}

Ausgang:

Rechtsverschiebung - Ausgang 2

Abschluss

Es wird geschlussfolgert, dass eine logische Verschiebung (Vorzeichenbit) bei der Rechtsverschiebung ein Nummernvorzeichenänderungsproblem verursacht, das in dem arithmetischen Rechtsverschiebungsoperator gesteuert werden kann. C und C++ haben nur arithmetische Verschiebung, wobei einige Bereiche undefiniert und implementierungsdefiniert bleiben.

Verwandter Artikel - C Operator