Verwenden von Bitmanipulationsmethoden in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung von union in Kombination mit struct zur Implementierung einer effizienten Bitmanipulations-Datenstruktur in C++
  2. Verwenden von std::bitset zur Durchführung von Bitmanipulationsoperationen in C++
  3. Verwenden der Bitmanipulation zum Vertauschen zweier Ganzzahlen in C++
Verwenden von Bitmanipulationsmethoden in C++

In diesem Artikel wird erläutert, wie Sie Bitmanipulationsmethoden in C++ verwenden.

Verwendung von union in Kombination mit struct zur Implementierung einer effizienten Bitmanipulations-Datenstruktur in C++

Bitmanipulation kann als weit gefasster Name für allgemeine Operationen angesehen werden, die an ganzzahligen Variablen mit bitweisen Operatoren ausgeführt werden. Bitweise Verschiebungsoperatoren werden häufig verwendet, um gängige arithmetische Operationen an Zahlen zu ersetzen und gleichzeitig eine bessere Leistung zu bieten. Beachten Sie, dass Integer-Typen häufig verwendet werden, um eine zusammengesetzte Datenstruktur zu implementieren, indem verschiedene Informationen in separaten Bitsätzen des gegebenen Typs gespeichert werden. Dieses Verfahren kann verwendet werden, um den Speicherbedarf von Daten zu minimieren und auch die Zugriffsgeschwindigkeiten zu verbessern.

In diesem Fall verwenden wir die Schlüsselwörter union und struct, um ein spezielles Objekt namens BitSet zum Speichern der Ganzzahl vom Typ uint32_t zu implementieren, die 32 Bits speichern kann. Beachten Sie, dass union eine spezielle Art von Klasse in C++ definiert, die mehrere Datenelemente haben kann, aber nur einer von ihnen kann zu einem bestimmten Zeitpunkt gültige Werte speichern. Als Ergebnis nimmt das Klassenobjekt normalerweise die Menge des größten Datenelements ein. Das folgende Beispiel demonstriert auch die Verwendung von Bitfeldern, wodurch vordefinierte Bitmengen in Integern mit der Member-Notation struct zugänglich sind. Das resultierende BitSet kann mit der regulären Zuweisungsoperation für jedes Mitglied oder mit Bitmanipulationen manipuliert werden.

#include <iostream>

using std::cout;
using std::endl;

union BitSet {
  struct {
    uint32_t b1 : 8;
    uint32_t b2 : 8;
    uint32_t b3 : 8;
    uint32_t b4 : 8;
  };
  uint32_t bb;
};

int main() {
  BitSet set1 = {'a', 'b', 'c', 'd'};
  cout << set1.b1 << " " << set1.b2 << " " << set1.b3 << " " << set1.b4 << endl;

  set1.bb = 'a' | ('b' << 8) | ('c' << 16) | ('d' << 24);

  cout << set1.b1 << " " << set1.b2 << " " << set1.b3 << " " << set1.b4 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

97 98 99 100
97 98 99 100

Verwenden von std::bitset zur Durchführung von Bitmanipulationsoperationen in C++

std::bitset ist Teil der C++-Standardbibliothek und repräsentiert eine Bitfolge fester Größe. Es bietet einen intuitiven Konstruktor und Bit-Modifizierer-/Zugriffsfunktionen, die einfacher zu verwenden sind als Rohoperationen auf Integer-Typen, die Bitmasken verwenden. std::bitset unterstützt alle bitweisen Operatoren und vergleicht ähnliche Objekte. Der nächste Codeausschnitt demonstriert einige der grundlegenden Operationen an std::bitset-Objekten.

#include <bitset>
#include <iostream>

using std::cout;
using std::endl;

int main() {
  std::bitset<8> bs1("11001001");
  std::bitset<8> bs2(~bs1);

  cout << "bs1        : " << bs1 << endl;
  cout << "bs2        : " << bs2 << endl;
  cout << "bs1 XOR bs2: " << (bs1 ^ bs2) << endl;
  cout << "bs1 reset  : " << bs1.reset() << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

bs1        : 11001001
bs2        : 00110110
bs1 XOR bs2: 11111111
bs1 reset  : 00000000

Verwenden der Bitmanipulation zum Vertauschen zweier Ganzzahlen in C++

Abgesehen von arithmetischen Operationen bieten einige bitweise Operatoren nützliche Funktionen, die viele gängige Programmierprobleme lösen. Ein solches Beispiel ist der Austausch zweier ganzzahliger Variablen mit dem bitweisen XOR-Operator. Beachten Sie, dass XOR-Swap keine bessere Leistung garantiert als regulärer Swap mit der temporären Variablen und auf modernen Desktop- und mobilen Anwendungsprozessoren sogar langsamer sein kann.

#include <bitset>
#include <iostream>

using std::cout;
using std::endl;

void SwapIntegers(int &x, int &y) {
  y = x ^ y;
  x = x ^ y;
  y = x ^ y;
}

int main() {
  int k = 5;
  int m = 9;

  cout << "k: " << k << " m: " << m << endl;
  SwapIntegers(k, m);
  cout << "k: " << k << " m: " << m << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

k: 5 m: 9
k: 9 m: 5
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