std::bitset în C++

Șir de N biți cu dimensiune fixă: setezi, ștergi și numeri biți, cu conversie în text sau în număr.

Sintaxă
#include <bitset>

std::bitset<N> biti;
std::bitset<N> biti(numar);
std::bitset<N> biti("0101");

Ce face std::bitset

std::bitset<N> ține exact N valori de tip adevărat/fals, împachetate câte una pe bit. Poți accesa un bit cu b[i] (bitul 0 este cel din dreapta, cel mai puțin semnificativ) sau cu test(i), care verifică poziția.

Funcții utile: set(i), reset(i), flip(i) (fără argument, pe toți biții), count() (câți biți sunt 1), any(), none(), all(), to_string() și to_ulong(). Operatorii &, |, ^, ~, <<, >> funcționează pe tot șirul.

Este potrivit pentru seturi mici de opțiuni (drepturi, zile ale săptămânii) și pentru a afișa un număr în binar. Dacă numărul de biți se stabilește la rulare, folosește std::vector<bool>.

Parametri

Parametru Descriere
N Numărul de biți (constantă la compilare).
numar / "0101" Valoarea inițială: un număr întreg sau un text din 0 și 1.

Ce returnează

Un obiect bitset. count() returnează numărul de biți setați, test(i) un bool.

Exemple

Exemplul 1: Un număr în binar

#include <bitset>
#include <print>

int main() {
    std::bitset<8> b(42);
    std::println("42 în binar: {}", b.to_string());
    std::println("Biți de 1: {}", b.count());
    std::println("Bitul 1: {}, bitul 3: {}", b.test(1), b.test(3));

    std::bitset<8> din_text("11110000");
    std::println("Ca număr: {}", din_text.to_ulong());
    std::println("AND: {}", (b & din_text).to_string());
}

Rezultat

42 în binar: 00101010
Biți de 1: 3
Bitul 1: true, bitul 3: true
Ca număr: 240
AND: 00100000

Exemplul 2: Zilele de program ale unui magazin

#include <array>
#include <bitset>
#include <print>
#include <string_view>

int main() {
    constexpr std::array<std::string_view, 7> zile{"L", "Ma", "Mi", "J", "V", "S", "D"};
    std::bitset<7> deschis;
    deschis.set();          // toate zilele
    deschis.reset(6);       // închis duminica
    deschis.flip(5);        // și sâmbăta

    for (std::size_t i = 0; i < zile.size(); ++i) {
        std::print("{}:{} ", zile[i], deschis.test(i) ? "da" : "nu");
    }
    std::println();
    std::println("Deschis {} zile pe săptămână", deschis.count());
}

Rezultat

L:da Ma:da Mi:da J:da V:da S:nu D:nu 
Deschis 5 zile pe săptămână

Greșeli frecvente

  • Te aștepți ca b[0] să fie primul caracter din to_string(). Bitul 0 este ultimul caracter (cel din dreapta).
  • Folosești b[i] cu un i mai mare sau egal cu N: comportament nedefinit. b.test(i) verifică și aruncă std::out_of_range.

Comenzi înrudite

  • std::array: Tablou cu dimensiune fixă, cunoscută la compilare, cu interfața unui container (size, at, begin, end).
  • std::vector: Tabloul dinamic din C++: ține elementele unul după altul în memorie și își mărește singur dimensiunea.