Bitweise Operationen in C

Muhammad Husnain 12 Oktober 2023
  1. Bitweise Operatoren & und &=
  2. Bitweise | und |= Operatoren
  3. Bitweise Operatoren ^ und ^=
  4. Bitwise Shift (>>) und (<<) Operatoren
  5. Arithmetische ShortHands (Zusammengesetzte Zuordnungsanweisungen)
  6. Lexikalische Analyse und was Sie nicht tun können
Bitweise Operationen in C

Dieser Artikel behandelt bitweise Operationen (und Operatoren) in C. Diese Konzepte gelten auch für C++.

Zusätzlich zu diesen Operatoren behandelt der Artikel eine allgemein missverstandene Kurzschreibweise für Operatorzuweisungen (wie die Operatorzuweisung +=). Wir werden dies im Zusammenhang mit bitweisen Operatoren diskutieren.

Der Artikel enthält ein Beispiel für jeden dieser Operatoren, das beide Notationen und ihre jeweiligen Ausgaben zeigt. Wir werden auch Kurzschreibweisen diskutieren, die von C nicht unterstützt werden.

Zuletzt werden wir kurz die lexikalische Analyse besprechen, die eine Stufe in der Kompilierung des Programms ist, in der der Compiler Tokens generiert. Dies sind die kleinsten Teile des Codes, wie Schlüsselwörter, Bezeichner, Konstanten, Zeichenfolgenliterale usw.

Bitweise Operatoren & und &=

& ist der bitweise und-Operator. Es wird so verwendet:

int test = 0x6A;
test = test & 0x50;

Der obige Code führt den bitweisen und-Vergleich zwischen 0x6A und 0x50 durch und speichert das Ergebnis in der Variable test. Die bitweise und-Operation vergleicht jedes Bit beider Argumente.

Das Ergebnis ist für jedes Bit 1, wenn die Bits beider Operanden 1 sind, andernfalls ist das Ergebnis 0.

Die Binärzahl für 0x6A ist 1101010 und die Binärzahl für 0x50 ist 1010000. Daher ist das Ergebnis der und-Operation 1000000.

Jetzt können wir die Kurzschreibweise diskutieren. Der obige Codeabschnitt kann bequem wie folgt geschrieben werden:

int test2 = 0x6A;
test2 &= 0x50;

Im Allgemeinen ist x &= 5 gleichbedeutend mit x = x & 5. Dies kann jedoch auch auf andere Operationen ausgedehnt werden; am gebräuchlichsten wäre +=, -=, *=, /=.

Ungewöhnlichere Beispiele für diese Kurzschreibweise sind bitweise Operationen wie >>=, <<=, |=, &=, ^=.

Bitweise | und |= Operatoren

| ist der bitweise inklusive or-Operator.

int test = 0x6A;
test = test | 0x50;

Die Kurzschreibweise dafür lautet:

int test = 0x6A;
test |= 0x50;

Der resultierende Wert von test ist 1111010.

Die bitweise inklusive oder-Operation vergleicht jedes Bit beider Argumente. Das Ergebnis ist 1 für jedes Bit, wenn eines der Bits der Operanden 1 ist, und das Ergebnis ist nur 0, wenn beide Operanden 0 sind.

Bitweise Operatoren ^ und ^=

^ ist der bitweise exklusive oder-Operator.

int test = 0x6A;
test = test ^ 0x50;

Die Kurzschreibweise dafür lautet:

int test = 0x6A;
test ^= 0x50;

Der resultierende Wert von test ist: 0111010

Die bitweise exklusive oder-Operation vergleicht jedes Bit beider Argumente. Der resultierende Bitwert ist 1 für jedes Bit des Ergebnisses, wenn die beiden Bits unterschiedliche Werte haben; es ist 0, wenn beide Bits den gleichen Wert haben.

Bitwise Shift (>>) und (<<) Operatoren

Die Schiebeoperatoren haben zwei Operanden.

Die Verschiebung wird auf den Operanden nach links angewendet. Und die Anzahl der Bits, auf die die Verschiebung angewendet wird, wird durch den rechten Operanden bestimmt.

Es gibt zwei Arten von Verschiebungen: die Linksverschiebung << und die Rechtsverschiebung >>. Es wird im Allgemeinen wie folgt verwendet:

Weitere Informationen zum Ergebnis des Schichtoperators finden Sie in diesem verknüpften Dokument, wenn Sie sich über dessen Details nicht sicher sind.

int test5 = 0xFF;
test5 = test5 << 2;

In diesem Beispiel werden die in test5 gespeicherten Bits um 2 Bits nach links verschoben (wie durch die Anweisung des Operators angegeben).

Before shift : 0011111111 After shift : 1111111100

Ebenso für die rechte Verschiebung:

int test5 = 0xFF;
test5 = test5 >> 2;

In diesem Beispiel werden die in test5 gespeicherten Bits um 2 Bits nach rechts verschoben.

Before shift : 11111111 After shift : 00111111

Die Kurzschreibweise für die Rechts- und Linksverschiebung ist ähnlich wie oben.

Kurzschreibweise Rechtsverschiebung:

int test5 = 0xFF;
test5 >>= 2;

Kurzschreibweise für Linksverschiebung:

int test5 = 0xFF;
test5 <<= 2;

Arithmetische ShortHands (Zusammengesetzte Zuordnungsanweisungen)

In diesem Abschnitt werden kurz Abkürzungen für arithmetische Operationen behandelt. Die beiden folgenden Anweisungen nach der Variablendeklaration sind äquivalent:

Zur Ergänzung:

int addTest = 5;

addTest += 5;

Und

addTest = addTest + 5;

Zum Multiplizieren:

int multTest = 5;

multTest *= 5;

Und

multTest = multTest * 5;

Zur Teilung:

int divTest = 5;

divTest /= 5;

Und

divTest = divTest / 5;

Zur Subtraktion:

int subTest = 5;

subTest -= 5;

Und

subTest = subTest - 5;

Für Modulo/Rest (%):

int remTest = 5;

remTest %= 5;

Und

remTest = remTest % 5;

Lexikalische Analyse und was Sie nicht tun können

Die lexikalische Analyse ist eine Phase, in der jeder Operand und der Operator in Tokens getrennt werden. Beispiel: In einer Anweisung x + 2, bei der x eine Variable ist, trennt der Analysator x und 2 als Operanden und + als Operator.

Bei der Kurzschreibweise werden Operatoren wie |= mit einem Token-Code gespeichert, der ausreicht, um sie zu identifizieren. Wenn irgendwelche Abkürzungen nicht funktionieren, wurden sie (einfach) nicht für den lexikalischen Analysator C definiert; selbst wenn sie den lexikalischen Analysator bestehen, werden sie vom Syntaxanalysator zurückgewiesen.

Deshalb funktionieren Abkürzungen wie >>>> oder ||= oder &&= nicht. Vielleicht gäbe es eine Programmiersprache, in der sie als gültige Operatoren akzeptiert werden.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Verwandter Artikel - C Bit