Use métodos de manipulação de bits em C++

Jinku Hu 12 outubro 2023
  1. Use union combinada com struct para implementar uma estrutura de dados de manipulação de bits eficiente em C++
  2. Use std::bitset para conduzir operações de manipulação de bits em C++
  3. Use manipulação de bits para trocar dois inteiros em C++
Use métodos de manipulação de bits em C++

Este artigo explicará como usar métodos de manipulação de bits em C++.

Use union combinada com struct para implementar uma estrutura de dados de manipulação de bits eficiente em C++

A manipulação de bits pode ser considerada um nome amplo para operações comuns conduzidas em variáveis ​​inteiras com operadores bit a bit. Operadores de deslocamento bit a bit são freqüentemente usados ​​para substituir operações aritméticas comuns em números, oferecendo melhor desempenho. Observe que os tipos inteiros são comumente usados ​​para implementar uma estrutura de dados composta, armazenando informações diferentes em conjuntos de bits separados do tipo fornecido. Este método pode ser usado para minimizar a pegada de memória dos dados e também melhorar as velocidades de acesso.

Neste caso, utilizamos as palavras-chave union e struct para implementar um objeto especial denominado BitSet para armazenar o inteiro do tipo uint32_t, que pode armazenar 32 bits. Lembre-se de que union define um tipo especial de classe em C++ que pode ter vários membros de dados, mas apenas um deles pode armazenar um valor válido em um determinado momento. Como resultado, o objeto de classe geralmente ocupa a quantidade do maior membro de dados. O exemplo a seguir também demonstra o uso de campos de bits, tornando conjuntos predefinidos de bits em inteiros acessíveis usando a notação de membro struct. O BitSet resultante pode ser manipulado usando a operação de atribuição regular para cada membro ou usando manipulações 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;
}

Resultado:

97 98 99 100
97 98 99 100

Use std::bitset para conduzir operações de manipulação de bits em C++

std::bitset faz parte da biblioteca padrão C++ e representa uma sequência de bits de tamanho fixo. Ele fornece um construtor intuitivo e funções de modificador / acesso de bit que são mais fáceis de utilizar do que operações brutas em tipos inteiros usando bitmasks. std::bitset suporta todos os operadores bit a bit e compara objetos semelhantes. O próximo trecho de código demonstra algumas das operações básicas em 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;
}

Resultado:

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

Use manipulação de bits para trocar dois inteiros em C++

Além das operações aritméticas, alguns operadores bit a bit fornecem recursos úteis que resolvem muitos problemas comuns de programação. Um exemplo é trocar duas variáveis ​​inteiras usando o operador bit a bit XOR. Observe que a troca XOR não garante melhor desempenho do que a troca regular usando a variável temporária e pode até ser mais lenta em desktops contemporâneos e processadores de aplicativos móveis.

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

Resultado:

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