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