Usar métodos de manipulación de bits en C++

Jinku Hu 12 octubre 2023
  1. Utilice union combinado con struct para implementar una estructura de datos de manipulación de bits eficiente en C++
  2. Utilice std::bitset para realizar operaciones de manipulación de bits en C++
  3. Utilice la manipulación de bits para intercambiar dos enteros en C++
Usar métodos de manipulación de bits en C++

Este artículo explicará cómo utilizar métodos de manipulación de bits en C++.

Utilice union combinado con struct para implementar una estructura de datos de manipulación de bits eficiente en C++

La manipulación de bits puede considerarse un nombre amplio para operaciones comunes realizadas en variables enteras con operadores bit a bit. Los operadores de desplazamiento bit a bit se utilizan a menudo para sustituir operaciones aritméticas comunes en números y ofrecer un mejor rendimiento. Tenga en cuenta que los tipos enteros se utilizan comúnmente para implementar una estructura de datos compuesta almacenando información diferente en conjuntos de bits separados del tipo dado. Este método se puede utilizar para minimizar la huella de memoria de los datos y también mejorar las velocidades de acceso.

En este caso, utilizamos las palabras clave union y struct para implementar un objeto especial llamado BitSet para almacenar el entero de tipo uint32_t, que puede almacenar 32 bits. Tenga en cuenta que union define un tipo especial de clase en C++ que puede tener varios miembros de datos, pero solo uno de ellos puede almacenar un valor válido en un momento dado. Como resultado, el objeto de clase suele ocupar la cantidad del miembro de datos más grande. El siguiente ejemplo también demuestra el uso de campos de bits, haciendo accesibles conjuntos predefinidos de bits en enteros usando la notación de miembro struct. El BitSet resultante se puede manipular utilizando la operación de asignación regular para cada miembro o utilizando manipulaciones 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;
}

Producción :

97 98 99 100
97 98 99 100

Utilice std::bitset para realizar operaciones de manipulación de bits en C++

std::bitset es parte de la biblioteca estándar de C++ y representa una secuencia de bits de tamaño fijo. Proporciona un constructor intuitivo y funciones de acceso/modificación de bits que son más fáciles de utilizar que las operaciones en bruto en tipos enteros que utilizan máscaras de bits. std::bitset soporta todos los operadores bit a bit y compara objetos similares. El siguiente fragmento de código demuestra algunas de las operaciones básicas en objetos 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;
}

Producción :

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

Utilice la manipulación de bits para intercambiar dos enteros en C++

Aparte de las operaciones aritméticas, algunos operadores bit a bit proporcionan funciones útiles que resuelven muchos problemas comunes de programación. Un ejemplo de ello es intercambiar dos variables enteras utilizando el operador bit a bit XOR. Tenga en cuenta que el intercambio de XOR no garantiza un mejor rendimiento que el intercambio normal utilizando la variable temporal y puede incluso ser más lento en los procesadores de aplicaciones móviles y de escritorio actuales.

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

Producción :

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