Sections

FG&A s.r.l.

Personal tools
You are here: Home Articoli Formattare un numero in binario
Document Actions

Formattare un numero in binario

Più di una volta mi è capitato di leggere domande, nei newsgroup, per trovare un modo semplice per formattare un intero come maschera di bit.

Author: Mario Graziosi, mgnospam@fgasoftware.com

Più di una volta mi è capitato di leggere domande, nei newsgroup, per trovare un modo semplice per formattare un intero come maschera di bit. Per esempio, l'intero 45 dovrebbe essere visualizzato, supponendo di avere 8 bits, come 00101101. E' vero che si può sviluppare una funzione non troppo complessa che ci dà il risultato desiderato, ma con la standard library del C++ la cosa è diventata ancora più semplice.

La standard C++ library comprende una classe (templetizzata) che gestisce array di bit. Così, se vogliamo creare una array di 8 bit, è sufficiente scrivere qualcosa come:

    bitset<8> bits;
bits = 45;
cout << "bit mask = " << bits << endl;
e il risultato sarà 00101101 (ossia 45 in binario). Naturalmente è possibile anche definire array di bit di altre dimensioni, per esempio 12, 32, 64 e 93 bit:
    bitset<12> a;
bitset<32> b;
bitset<64> c;
bitset<93> d;

La classe bitset (che, naturalmente è "templetizzata"), può quindi essere utilizzata per rappresentare array di bit che non sono necessariamente limitati ad una determinata dimensione, come invece avremmo se usiamo degli int. Visto che in C++ è possibile istanziare una classe "al volo", come temporaneo, possiamo anche formattare un numero senza dover istanziare esplicitamente un oggetto bitset per poi visualizzarlo. Per esempio:

    int x = 45;
cout << bitset<8>(x) << endl; // 1
cout << bitset<16>(x*2) << endl; // 2
nella riga [1] dell'esempio sopra stiamo formattando 'x' con 8 bit, mentre nella riga successiva [2] stiamo formattando il valore di x*2 con 16 bit (il tutto senza doverci inventare variabili temporanee con nomi insignificanti).

Vi sono altre operazioni supportate da bitset, come OR, AND e SHIFT di bit (tutte con i rispettivi operatori). Per un reference completo vi suggerisco l'help del vostro compilatore. E a proposito di compilatore... nella versione 1.0 di C++ Builder bitset non è supportato, mentre nella versione 3.0 di C++ Builder lo trovate. In Visual C++ 5.x biset è implementato (non ho potuto provare con VC++ 4.x). Per utilizzare bitset è necessario includere l'apposito file. Per esempio:

    #include <bitset>
using std::bitset // Usa solo la classe bitset
oppure
    #include <bitset>
using namespace std; // Usa tutto il namespace std
oppure
    #include <bitset>
// ...
std::bitset<8> bits; // Esplicita il namespace di bitset