Use métodos de manipulação de bits em C++
-
Use
union
combinada comstruct
para implementar uma estrutura de dados de manipulação de bits eficiente em C++ -
Use
std::bitset
para conduzir operações de manipulação de bits em C++ - Use manipulação de bits para trocar dois inteiros 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
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