1. Überblick über bitweise Operationen

In modernen Computern werden alle Daten in binärer Form gespeichert, d. h. in zwei Zuständen: 0 und 1. Operationen, die von Computern auf binären Daten ausgeführt werden (wie Addition, Subtraktion, Multiplikation und Division), werden als Bitoperationen bezeichnet, also als Operationen, die auf jedes Bit einer Binärzahl wirken.

Um Bitoperationen besser zu verstehen, hier ein einfaches Beispiel: Angenommen, wir haben den folgenden Code, um zwei ganze Zahlen zu addieren:

int a = 35;
int b = 47;
int c = a + b;

Der Computer wandelt diese beiden ganzen Zahlen in die Binärform um und führt dann die Addition durch:

35:  0010 0011
47:  0010 1111
----------------
82:  0101 0010

Daher, verglichen mit der direkten Verwendung von+、-、*、/Operatoren, kann der sinnvolle Einsatz von Bitoperationen die Ausführungseffizienz des Codes auf der Maschine deutlich verbessern.

2. Bitoperationen auf einen Blick

Symbol Beschreibung Operationsregel
& und Das Ergebnis ist nur dann 1, wenn beide Bits 1 sind.
| oder Das Ergebnis ist nur dann 0, wenn beide Bits 0 sind.
^ XOR Das Ergebnis ist 0, wenn die beiden Bits gleich sind, und 1, wenn sie unterschiedlich sind.
~ NICHT 0 wird zu 1 und 1 wird zu 0.
<< Linksverschiebung Alle Bits werden um eine bestimmte Anzahl von Positionen nach links verschoben; höherwertige Bits werden verworfen, und niederwertige Bits werden mit 0 aufgefüllt.
>> Rechtsverschiebung Alle Bits werden um eine bestimmte Anzahl von Positionen nach rechts verschoben; die hohen Bits werden mit 0 oder dem Vorzeichenbit aufgefüllt.

3. Bitweiser AND-Operator (&)

Definition: führt eine "AND"-Operation an den Binärbits der beiden beteiligten Datenoperanden aus.

Operationsregel:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Zusammenfassung: Nur wenn beide Bits 1 sind, ist das Ergebnis 1; andernfalls ist das Ergebnis 0.

Zum Beispiel:3 & 5i.e.0000 0011 & 0000 0101 = 0000 0001, daher3 & 5der Wert ist 1.

Hinweis: Negative Zahlen nehmen an bitweisen AND-Operationen in Zweierkomplementform teil.

Anwendungen:

  1. Nullsetzen: Wenn Sie eine Einheit auf null setzen möchten, verknüpfen Sie sie einfach per AND mit einem Wert, dessen Bits alle null sind; das Ergebnis ist null.
  2. Die angegebenen Bits einer Zahl extrahieren: Zum Beispiel: Um dieX = 1010 1110niedrigen 4 Bits einer Zahl zu erhalten, suchen Sie einfach eine andere ZahlY = 0000 1111, dannX & Y = 0000 1110so können SieXdie angegebenen Bits erhalten.
  3. Gerade oder ungerade bestimmen: Indem Sie prüfen, ob das niederwertigste Bit 0 oder 1 ist, um die Parität zu bestimmen, können Sie verwendenif ((a & 1) == 0)anstelle vonif (a % 2 == 0)um festzustellenaob sie gerade ist.

4. Bitweiser OR-Operator (|)

Definition: führt eine "OR"-Operation an den Binärbits der beiden beteiligten Operanden durch.

Operationsregel:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Zusammenfassung: Solange eines von ihnen 1 ist, ist das Ergebnis 1.

Zum Beispiel:3 | 5i.e.0000 0011 | 0000 0101 = 0000 0111, daher3 | 5der Wert ist 7.

Hinweis: Negative Zahlen nehmen in Zweierkomplementform an bitweisen OR-Operationen teil.

Anwendungen:

  1. Bestimmte Bits auf 1 setzen: Um beispielsweise dieX = 1010 1110niedrigen 4 Bits einer Zahl auf 1 zu setzen, suchen Sie einfach eine andere ZahlY = 0000 1111, dannX | Y = 1010 1111damit können Sie es erreichen.

5. Bitweiser XOR-Operator (^)

Definition: führt eine "XOR"-Operation an den Binärbits der beiden beteiligten Datenoperanden durch.

Operationsregel:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

Zusammenfassung: Wenn die entsprechenden Bits gleich sind, ist das Ergebnis 0; wenn sie unterschiedlich sind, ist das Ergebnis 1.

Eigenschaften:

  1. Kommutativgesetz
  2. Assoziativgesetz:(a ^ b) ^ c == a ^ (b ^ c)
  3. Für jede Zahlx, giltx ^ x = 0,x ^ 0 = x
  4. Selbstinvers:a ^ b ^ b = a ^ 0 = a

Anwendungen:

  1. Die angegebenen Bits umkehren: Zum Beispiel, um dieX = 1010 1110niedrigen 4 Bits einer Zahl zu erhalten, suchen Sie einfach eine andere ZahlY = 0000 1111, dannX ^ Y = 1010 0001damit können Sie es erreichen.
  2. XOR mit 0 lässt den Wert unverändert: zum Beispiel1010 1110 ^ 0000 0000 = 1010 1110
  3. Zwei Zahlen vertauschen:
void Swap(int &a, int &b) {
if (a != b) {
    a ^= b;
    b ^= a;
    a ^= b;
}
}

6. Bitweiser NOT-Operator (~)

Definition: führt eine "NOT"-Operation an den Binärbits des beteiligten einzelnen Operanden durch.

Operationsregel:

~1 = 1111 1110
~0 = 1111 1111

Das heißt:

~1 = -2
~0 = -1

Zusammenfassung: 0 in 1 ändern und 1 in 0.

Anwendungen:

  1. Das niederwertigste Bit einer Zahl auf null setzen: Zum Beispiel, umaUm das niedrigstwertige Bit einer Zahl auf 0 zu setzen, kann es ausgedrückt werden als:a & ~1。~1der Wert von ... ist1111 1111 1111 1110, dann eine "AND"-Operation durchführen, und das niedrigstwertige Bit wird sicherlich 0 sein.

7. Linksverschiebungsoperator (<<)

Definition: Verschiebe alle Binärbits eines Operanden um eine bestimmte Anzahl von Positionen nach links; hohe Bits werden verworfen, und niedrige Bits werden mit 0 aufgefüllt.

Zum Beispiel seiena = 1010 1110,a = a << 2wirdadie Binärbits von ... um 2 Positionen nach links verschoben, wobei rechts Nullen aufgefüllt werden, was ergibta = 1011 1000。

Wenn die beim Linksverschieben verworfenen hohen Bits keine 1 enthalten, dann entspricht jede Linksverschiebung um eine Position einer Multiplikation der Zahl mit 2.

8. Rechtsverschiebungsoperator (>>)

Definition: Verschiebe alle Binärbits einer Zahl um eine bestimmte Anzahl von Positionen nach rechts; hohe Bits werden mit 0 oder dem Vorzeichenbit aufgefüllt, und die rechte Seite wird verworfen.

Zum Beispiel,a = a >> 2wirdadie Binärbits von ... werden um 2 Positionen nach rechts verschoben, wobei die linke Seite mit 0 oder dem Vorzeichenbit aufgefüllt wird, je nachdem, ob die Zahl positiv oder negativ ist.

Jedes Mal, wenn ein Operand um eine Position nach rechts verschoben wird, entspricht dies einer Division der Zahl durch 2.

9. Zusammengesetzte Zuweisungsoperatoren

Bitweise Operatoren werden mit Zuweisungsoperatoren kombiniert, um neue zusammengesetzte Zuweisungsoperatoren zu bilden, die folgenden:

  • &= Beispiel:a &= bist äquivalent zua = a & b
  • |= Beispiel:a |= bist äquivalent zua = a | b
  • >>= Beispiel:a >>= bist äquivalent zua = a >> b
  • <<= Beispiel:a <<= bist äquivalent zua = a << b
  • ^= Beispiel:a ^= bist äquivalent zua = a ^ b

Die Operationsregeln ähneln denen der oben genannten zusammengesetzten Zuweisungsoperatoren.

Bitweise Operationen mit Daten unterschiedlicher Länge:

Wenn zwei Datenobjekte unterschiedlicher Länge einer bitweisen Operation unterzogen werden, richtet das System sie an ihren rechten Enden aus und führt dann die bitweise Operation durch.

Nehmen wir die "UND-Operation" als Beispiel:

In der Sprache C,longTyp belegt 4 Bytes,intTyp belegt 2 Bytes. Wenn einlongDatenwert vom Typ und einintDatenwert vom Typ eine "UND-Operation" durchlaufen, werden nach rechtsbündiger Ausrichtung die fehlenden Bits auf der linken Seite entsprechend den folgenden drei Fällen aufgefüllt:

  1. Wenn die Integer-Daten positiv sind, werden die linken Bits mit 16 Nullen aufgefüllt.
  2. Wenn die Integer-Daten negativ sind, werden die linken Bits mit 16 Einsen aufgefüllt.
  3. Wenn die Integer-Daten vorzeichenlos sind, werden die linken Bits ebenfalls mit 16 Nullen aufgefüllt.

Zum Beispiel:

long a = 123;
int b = 1;
long result = a & b;
long a = 123;
unsigned int b = 1;
long result = a & b;