Usa metodi di manipolazione dei bit in C++

Jinku Hu 12 ottobre 2023
  1. Usa union combinato con struct per implementare una struttura dati efficiente per la manipolazione dei bit in C++
  2. Usa std::bitset per eseguire operazioni di manipolazione dei bit in C++
  3. Usa la manipolazione dei bit per scambiare due interi in C++
Usa metodi di manipolazione dei bit in C++

Questo articolo spiegherà come utilizzare i metodi di manipolazione dei bit in C++.

Usa union combinato con struct per implementare una struttura dati efficiente per la manipolazione dei bit in C++

La manipolazione dei bit può essere considerata un nome generico per operazioni comuni condotte su variabili intere con operatori bit per bit. Gli operatori di spostamento bit a bit vengono spesso utilizzati per sostituire operazioni aritmetiche comuni sui numeri offrendo prestazioni migliori. Si noti che i tipi interi sono comunemente usati per implementare una struttura di dati composta memorizzando informazioni diverse in insiemi di bit separati del tipo dato. Questo metodo può essere utilizzato per ridurre al minimo l’ingombro della memoria dei dati e anche per migliorare la velocità di accesso.

In questo caso, utilizziamo le parole chiave union e struct per implementare un oggetto speciale chiamato BitSet per memorizzare l’intero di tipo uint32_t, che può memorizzare 32 bit. Tieni presente che union definisce un tipo speciale di classe in C++ che può avere più membri di dati, ma solo uno di essi può memorizzare un valore valido in un dato momento. Di conseguenza, l’oggetto classe in genere occupa la quantità del membro dati più grande. L’esempio seguente mostra anche l’uso dei campi di bit, rendendo accessibili insiemi predefiniti di bit in interi utilizzando la notazione membro struct. Il BitSet risultante può essere manipolato usando la normale operazione di assegnazione per ogni membro o usando manipolazioni di bit.

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

Produzione:

97 98 99 100
97 98 99 100

Usa std::bitset per eseguire operazioni di manipolazione dei bit in C++

std::bitset fa parte della libreria standard C++ e rappresenta una sequenza di bit a dimensione fissa. Fornisce un costruttore intuitivo e funzioni di modifica/accesso ai bit che sono più facili da utilizzare rispetto alle operazioni non elaborate su tipi interi che utilizzano maschere di bit. std::bitset supporta tutti gli operatori bit a bit e confronta oggetti simili. Il prossimo frammento di codice mostra alcune delle operazioni di base sugli oggetti 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;
}

Produzione:

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

Usa la manipolazione dei bit per scambiare due interi in C++

Oltre alle operazioni aritmetiche, alcuni operatori bit a bit forniscono funzionalità utili che risolvono molti problemi comuni di programmazione. Un esempio è quello di scambiare due variabili intere usando l’operatore XOR bit a bit. Si noti che lo scambio XOR non garantisce prestazioni migliori rispetto allo scambio regolare utilizzando la variabile temporanea e potrebbe anche essere più lento sui processori di applicazioni desktop e mobili contemporanei.

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

Produzione:

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