Bitová sada C++ a její aplikace
Bitová sada je pole boolů, ale každá booleovská hodnota není místo toho uložena v samostatném bajtu, bitová sada optimalizuje prostor tak, aby každá booleovská hodnota zabírá pouze 1bitový prostor , tak prostor zabraný bitovou sadou je menší než u pole bool nebo vektoru bool .
Omezení bitsetu je to velikost musí být známa v době kompilace, tj. velikost bitové sady je pevná.
std::bitset je šablona třídy pro bitovou sadu, která je definována uvnitř hlavičkový soubor takže před použitím bitset v našem programu musíme zahrnout hlavičkový soubor.
Syntax:
bitset variable_name(initialization);
Bitset můžeme inicializovat třemi způsoby:
1. Neinicializováno: Všechny bity budou nastaveny na nulu.
bitset variable_name;
2. Inicializace s dekadickým celým číslem: Bitset bude reprezentovat dané dekadické číslo v binární podobě.
bitset variable_name(DECIMAL_NUMBER);
3. Inicializace pomocí binárního řetězce: Bitset bude reprezentovat daný binární řetězec.
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); Příklad:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>neinicializovanáBitset; // inicializace s bitovou sadou desetinných čísel <8>decimalBitset(15); // inicializace pomocí bitové sady binárních řetězců <8>stringBitset(string('1111')); cout < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } Výstup
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
std::bitset členské funkce
Třída std::bitset obsahuje některé užitečné členské funkce pro práci s objekty bitset. Zde je seznam některých členských funkcí std::bitset:
| Název funkce | Popis funkce |
|---|---|
| soubor() | Nastav bitovou hodnotu na daném indexu do 1 . |
| reset() | Nastav bitovou hodnotu na daném indexu na 0 . |
| převrátit () | Překlopte hodnotu bitu na daném indexu. |
| počet() | Počet počet nastavit bity . |
| test() | Vrátí booleovská hodnota na daném indexu . |
| žádný() | Kontroluje, zda žádný bit je soubor . |
| žádný() | Kontroluje, zda žádný bit je soubor. |
| Všechno() | Zkontrolujte, zda Všechno bit je soubor. |
| velikost() | Vrátí velikost bitsetu. |
| to_string() | Převádí bitset na std::string. |
| následovat() | Převádí bitset na unsigned long. |
| to_ullong() | Převádí bitset na unsigned long long. |
Příklad:
C++ // C++ program to demonstrate the // use of std::bitset member // functions #include #include using namespace std; int main() { // declaring index variable int index = 0; // declaring few bitset objects bitset <4>allSet('1111'), allUnset; cout < < 'any() value: ' < < boolalpha < < allSet.any() < < endl; cout < < 'all() value: ' < < allSet.all() < < endl; cout < < 'none() value: ' < < allSet.none() < < endl; cout < < 'test() at index 0: ' < < noboolalpha < < allSet.test(index) < < endl; cout < < 'size() value: ' < < allSet.size() < < endl; cout < < 'Value of allUnset on before using set(): ' < < allUnset < < endl; allUnset.set(index); cout < < 'Value of allUnset on after using set(): ' < < allUnset < < endl; cout < < 'Value of allSet on before using reset(): ' < < allSet < < endl; allSet.reset(index); cout < < 'Value of allSet on after using reset(): ' < < allSet < < endl; // declaring an empty string string bitString; // using to_string() method to assign value to empty // string bitString = allSet.to_string(); cout < < 'bitString: ' < < bitString < < endl; cout < < 'Unsigned Long value: ' < < allSet.to_ulong(); return 0; } Výstup
any() value: true all() value: true none() value: false test() at index 0: 1 size() value: 4 Value of allUnset on before using set(): 0000 Value of allUnset on after using set(): 0001 Value of allSet on before using reset(): 1111 Value of allSet on after using reset(): 1110 bitString: 1110 Unsigned Long value: 14
Poznámka: boolalpha se používá k tisku true a false místo 1 nebo 0 pro booleovské hodnoty a noboolalpha pro opačné hodnoty.
std::bitset Operátoři
Některé ze základních operátorů jsou přetížené pro práci s objekty bitset. Níže je uveden seznam těchto operátorů:
| Operátor | Úkon |
|---|---|
| [] | Přístup operátor |
| & | bitový A |
| | | bitový NEBO |
| ! | bitový VOLNÝ, UVOLNIT |
| >>= | Binární Pravý posun a přiřadit |
| < <= | Binární Levý Shift a přiřadit |
| &= | Přiřaďte hodnotu bitově A do prvního bitsetu. |
| |= | Přiřaďte hodnotu bitově NEBO do prvního bitsetu. |
| ^= | Přiřaďte hodnotu bitově VOLNÝ, UVOLNIT do prvního bitsetu. |
| ~ | bitový NE |
Příklad:
C++ // C++ program to show the different operator functions on // bitset #include #include using namespace std; int main() = bitset2) < < endl; // bitwise NOT cout < < 'Bitwise NOT: ' < < (result = ~bitset1) < < endl; // bitwise XOR bitset1 = 9; cout < < 'Bitwise XOR: ' < < (bitset1 ^= bitset2) < < endl; bitset1 = 9; cout < < 'Binary leftshift on bitwise1: ' < < (bitset1 < <= 1) < < endl; bitset1 = 9; cout < < 'Binary rightshift on bitwise1: ' < < (bitset1>>= 1) < < endl; return 0;
Výstup
Bitset1: 1001 Bitset2: 1010 Accessing bit value at index 1 of bitset1: 0 Bitwise AND using &: 1000 Bitwise AND using &=: 1000 Bitwise OR using |: 1011 Bitwise OR using |=: 1011 Bitwise NOT: 0100 Bitwise XOR: 0011 Binary leftshift on bitwise1: 0010 Binary rightshift on bitwise1: 0100
Rozdíl mezi std::bitset a std::vector a polem bool
Vektor bool a pole bool lze také implementovat pro uložení sekvence booleovských hodnot, jako je bitset, ale mezi každou implementací existují určité rozdíly:
| Parametr | bitset | vektor bool | pole bool |
|---|---|---|---|
| Definice | Šablona třídy sestávající ze sekvence bitů uložených tak, že každý bit zabírá 1 bit paměti. | Variace vektorů C++ STL, ve kterých má každý prvek velikost 1 bit a je typu bool | Souvislá kolekce boolových datových prvků s pevnou velikostí. |
| Velikost | Pevná velikost. | Dynamická velikost. | Pevná velikost. |
| Paměť | Jeden prvek zabírá 1 bit paměti. | Jeden prvek zabírá 1 bit paměti. | Jeden prvek zabírá 1 bajt paměti. |
| Rychlost | Stejný | Stejný | Rychleji |