Utiliser les méthodes de manipulation de bits en C++

Jinku Hu 12 octobre 2023
  1. Utilisez union combiné avec struct pour implémenter une structure de données de manipulation de bits efficace en C++
  2. Utilisez std::bitset pour effectuer des opérations de manipulation de bits en C++
  3. Utilisez la manipulation de bits pour échanger deux entiers en C++
Utiliser les méthodes de manipulation de bits en C++

Cet article explique comment utiliser les méthodes de manipulation de bits en C++.

Utilisez union combiné avec struct pour implémenter une structure de données de manipulation de bits efficace en C++

La manipulation de bits peut être considérée comme un nom large pour les opérations courantes effectuées sur des variables entières avec des opérateurs au niveau du bit. Les opérateurs de décalage au niveau du bit sont souvent utilisés pour remplacer les opérations arithmétiques courantes sur les nombres tout en offrant de meilleures performances. Notez que les types entiers sont couramment utilisés pour implémenter une structure de données composée en stockant différentes informations dans des ensembles de bits séparés du type donné. Cette méthode peut être utilisée pour minimiser l’empreinte mémoire des données et également améliorer les vitesses d’accès.

Dans ce cas, nous utilisons les mots-clés union et struct pour implémenter un objet spécial nommé BitSet pour stocker l’entier de type uint32_t, qui peut stocker 32 bits. N’oubliez pas que union définit un type spécial de classe en C++ qui peut avoir plusieurs membres de données, mais un seul d’entre eux peut stocker une valeur valide à un moment donné. Par conséquent, l’objet de classe occupe généralement la quantité du plus gros membre de données. L’exemple suivant montre également l’utilisation des champs de bits, rendant des ensembles prédéfinis de bits dans des entiers accessibles à l’aide de la notation de membre struct. Le BitSet résultant peut être manipulé en utilisant l’opération d’affectation régulière pour chaque membre ou en utilisant des manipulations de bits.

#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;
}

Production:

97 98 99 100
97 98 99 100

Utilisez std::bitset pour effectuer des opérations de manipulation de bits en C++

std::bitset fait partie de la bibliothèque standard C++ et représente une séquence de bits de taille fixe. Il fournit un constructeur intuitif et des fonctions de modification/accès aux bits qui sont plus faciles à utiliser que les opérations brutes sur les types entiers à l’aide de masques de bits. std::bitset prend en charge tous les opérateurs au niveau du bit et compare des objets similaires. L’extrait de code suivant montre certaines des opérations de base sur les objets std::bitset.

#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;
}

Production:

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

Utilisez la manipulation de bits pour échanger deux entiers en C++

Outre les opérations arithmétiques, certains opérateurs au niveau du bit fournissent des fonctionnalités utiles qui résolvent de nombreux problèmes de programmation courants. Un tel exemple consiste à échanger deux variables entières à l’aide de l’opérateur binaire XOR. Notez que l’échange XOR ne garantit pas de meilleures performances que l’échange normal utilisant la variable temporaire et peut même être plus lent sur les processeurs d’applications mobiles et de bureau contemporains.

#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;
}

Production:

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