Sunteți pe pagina 1din 4

BITSET Un obiect bitset poate fi construit in 3

moduri - cu ajutorul constructorului implicit,


Georgescu Alice
dintr-un de șir de numere binare sau dintr-un
Colegiul National Mihai Viteazul, numă r întreg zecimal. Pentru a utiliza aceasta
Ploiești clasa trebuie inclusă in header-ul programului
Bitset este un container din biblioteca de directiva de preprocesare #include <bitset>
șabloane standard C++ pentru tratarea datelor Exemplul 1. folosirea constructorului
la nivel de biți. Sper ca acest scurt articol să vă implicit al clasei - 8 biti inițializați cu zero
convingă de utilitatea și eficiența acestuia în bitset<8> bitset1;
rezolvarea unor probleme cu grade de cout << " Crearea instanței utilizâ nd
dificultate diverse dar care impun restricții de constructorul implicit. Conținutul bitset1 :" <<
memorie. bitset1 << endl;
Care este diferența dintre un vector de tip bool Exemplul 2. construcție pe baza unui
și bitset? În C++, un bitset este o clasă șablon numă r întreg
care reprezintă o secvență de dimensiune fixă bitset<8> bitset2(177);
de biți, unde fiecare bit poate fi fie 0, fie 1. On cout << " Crearea instanței utilizâ nd un
vector bool, pe de altă parte, este un vector de întreg ca parametru. Conținutul bitset2: " <<
valori booleene, unde fiecare valoare poate fi bitset2 << endl;
fie adevă rat, fie fals (fiecare valoare consumă Exemplul 3. construcție pe baza unui șir
un octet (8 biți) în loc de un singur bit). Deci, binar
avantajul unui bitset este că este extrem de bitset<8> bitset3(string("11111100"));
eficient din punct de vedere al spațiului, cout << " Crearea instanței utilizâ nd un
necesitâ nd doar un singur bit pentru fiecare șir binar ca parametru. Conținutul bitset3: " <<
informație. bitset3 << endl;
Deoarece aceste operațiile pe bitset folosesc La rularea exemplelor de mai sus la
direct operații pe biți, calculele cu bitset sunt consola se va afișa:
extrem de rapide. Insă , lucrul cu vector de tip
bool este mai simplu datorită accesarii rapide a
informației prin indexare, în timp ce lucrul cu
biți necesită mai multă matematică , pentru a Observație: declarația bitset<64> oferă
accesa cuvâ ntul corect și apoi pentru a accesa spațiu pentru stocarea a 64 biți.
bitul corect. Setarea și resetarea biților unei
Există o limitare a bitset-ului datorată faptului instanțe a clasei BITSET
că dimensiunea acestuia trebuie cunoscută în Funcția membru de setare/resetare a
momentul compilă rii, adică dimensiunea clasei este utilizată pentru a seta sau a reseta
setului de biți este fixă . un anumit bit din bitset. Funcția de setare
Construcția unei instanțe a clasei activează toți biții din bitset. Pentru a seta un
BITSET anumit bit, putem trece locația bitului ca
parametru al funcției. În mod similar, apelul
funcției de resetare dezactivează bitul dat din
bitset.
Exemplul 4.
bitset2.reset();
cout << bitset2 << endl;
bitset2.set(4);
Observați ordinea de numerotare a
cout << bitset2 << endl;
poziției biților pentru instanța Bitset3.
bitset2.set(7);
Rețineți că funcția size() a clasei
cout << bitset2 << endl;
returnează numă rul de biți ai instanței create,
bitset3.set();
și funcția count() spune câ ți biți din setul de
cout << bitset3 << endl;
biți dat sunt în starea activată . Fragmentul de
bitset3.reset(1);
cod de mai jos arată că trei biți sunt activați.
cout << bitset3 << endl;
Exemplul 6.
bitset3.reset(2);
bitset3.reset();
cout << bitset3 << endl;
bitset3.set(2);
bitset3.set(4);
bitset3.set(5);
cout << bitset3.count() << " Bit(s) set" <<
endl;
Operații Bitset
Testarea stării bitului
Uneori este necesar să convertim
Cum verifică m starea unui anumit bit?
conținutul unui bitset într-un șir. În exemplul
Funcția de testare ia locația indexului bitului
urmă tor șirul rezultat conține N caractere,
care trebuie testat. Câ nd un bit testat este în
primul caracter corespunde ultimului (N-1-lea)
poziția pornit (adică 1), atunci funcția va
bit și ultimul caracter corespunde primului bit.
returna boolean true, în caz contrar, returnează
De asemenea, putem folosi prin intemediul
false. Fragmentul de cod de mai jos iterează
parametrilor caracterele folosite pentru a afișa
prin conținutul bitset-ului și testează starea
valoarea adevă rată și falsă .
fiecă rui bit. Pe baza rezultatului testului, bitul
Exemplul 7.
este SET sau Not SET este imprimat pe ieșirea
bitset<8> b(42);
consolei.
cout << b.to_string() <<'\n'
Exemplul 5.
<< b.to_string('*') << '\n'
cout << "Bitset3: " << bitset3 << endl;
<< b.to_string('O', 'X') << '\n';
for (int i=0; i<bitset3.size(); i++)
La consola se va afișa:
{ if (bitset3.test(i)) cout << "Bit " << i <<
00101010
" is Set" << endl;
**1*1*1*
else cout << "Bit " << i << " is Not Set"
<< endl; } OOXOXOXO
Funcții membru std::bitset continue;
Clasa bitset conține câ teva funcții }
membre utile pentru a lucra asupra obiectelor // altfel verifică m dacă este setat la 1 bitul
bitset. La urmă torul link gă siți lista unor funcții corespunză tor lui x
membre și a operatorilor: bit[x]? cout << "Da, " : cout << "Nu, ";
https://cplusplus.com/reference/bitset/bitset }
}
Problema 1 // calculul sumelor
Se dă un șir binar cu maxim 100 de void preprocesare(int a[], int n)
caractere. Să se determine câte cifre de 1 {
are șirul dat. bit.reset(); // inițializă m cu valoarea 0
Exemplu de rezolvare cu bitset // submulțimea cu suma 0 există
#include <bits/stdc++.h>
considerâ nd ca este submulțimea vidă
using namespace std;
int main () bit[0] = 1;
{ string s;
for (int i = 0; i < n; ++i) bit |= (bit <<
cin>>s;
bitset<100> x (s); a[i]);
cout << "Sirul are " << x.count() << " de 1 " ;
}
return 0;
} int main()
{
Problema 2
int a[] = {3, 1, 2, 25};
Dându-se o mulțime de numere
int q[] = {8, 7, 6, 9, 45, 4};
naturale să se verifice daca un număr dat x,
int n = sizeof(a) / sizeof(a[0]);
x<100000, se poate obține ca suma de
int nq = sizeof(q) / sizeof(q[0]);
numere din mulțimea dată.
preprocesare(a, n);
Exemplu de rezolvare cu bitset
interogare(q, nq);
#include <bits/stdc++.h>
return 0;
using namespace std;
}
# define MAXSUM 100000 // definim valoarea
maximă care se poate obține
Problema 3
bitset<MAXSUM> bit;
Găsiți toate aparițiile unui șir dat S1
// prelucrarea întrebă rilor
într-un alt șir S2 folosind Bitset.
void interogare(int q[], int nq )
Considerăm ca cele 2 șiruri sunt formate
{
doar din litere mici ale alfabetului englez.
for (int i=0; i<nq; i++)
Soluția presupune preprocesarea șirului s2.
{
Vom folosi o funcție care creează 26 de bitset
int x = q[i];
(fiecare cu lungimea maximă a textului + 1),
// dacă x > dimensiunea bitset-ului
câ te unul pentru fiecare literă din alfabet. Prin
if (x >= MAXSUM)
urmare, mask[c] va reprezenta toate locațiile
{
din text în care este caracterul c.
cout << "Nu, ";
const int N = MAX_LEN + 1; for(int i = 1; i < pattern.size(); ++i) {
bitset<N> mask[26]; int c = pattern[i] - 'a';
void calcul(string text) { startMask &= (mask[c] >> i);
text = "#" + text; // indexam șirul de la 1 }
for(int i = 1; i < text.size(); ++i) { return startMask.count();
int c = text[i] - 'a'; }
mask[c].set(i); Algoritmul de mai sus poate fi utilizat si pentru
} a determina numarul de apariții ale unui subșir
} într-un șir.
int CautareSir(string pattern) {
if(pattern.size() > text.size()) { return Webografie
0; } https://en.cppreference.com/w/cpp/utility/
pattern = "#" + pattern; bitset
bitset<N> startMask; https://www.pbinfo.ro/articole/23872/cpp-
startMask.set(); stl-bitset Autor Siviu Candale

S-ar putea să vă placă și