Bitová sada C++ a jej aplikácia
Bitová množina je pole boolov, ale každá boolovská hodnota nie je uložená v samostatnom byte, bitová množina optimalizuje priestor tak, že každá booleovská hodnota zaberá iba 1-bitový priestor , takže priestor zaberaný bitovou množinou je menší ako priestor poľa bool alebo vektora bool .
Obmedzením bitsetu je to veľkosť musí byť známa v čase kompilácie, t.j. veľkosť bitovej sady je pevná.
std::bitset je šablóna triedy pre bitovú množinu, ktorá je definovaná vo vnútri hlavičkový súbor takže pred použitím bitsetu v našom programe musíme zahrnúť hlavičkový súbor.
Syntax:
bitset variable_name(initialization);
Bitset môžeme inicializovať tromi spôsobmi:
1. Neinicializované: Všetky bity budú nastavené na nulu.
bitset variable_name;
2. Inicializácia s desiatkovým celým číslom: Bitset bude reprezentovať dané desiatkové číslo v binárnom tvare.
bitset variable_name(DECIMAL_NUMBER);
3. Inicializácia pomocou binárneho reťazca: Bitset bude reprezentovať daný binárny reťazec.
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); Príklad:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>uninicializedBitset; // inicializácia bitovou sadou desatinných čísel <8>decimalBitset(15); // inicializácia s bitovou sadou binárnych reťazcov <8>stringBitset(string('1111')); cout < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } Výkon
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
std::bitset členské funkcie
Trieda std::bitset obsahuje niektoré užitočné členské funkcie na prácu s objektmi bitset. Tu je zoznam niektorých členských funkcií std::bitset:
| Názov funkcie | Popis funkcie |
|---|---|
| set() | Nastaviť bitová hodnota pri danom indexe do 1 . |
| reset() | Nastaviť bitová hodnota pri danom indexe na 0 . |
| prevrátiť () | Otočte hodnotu bitu pri danom indexe. |
| počítať () | počítať počet nastaviť bity . |
| test() | Vráti boolovská hodnota pri danom indexe . |
| akýkoľvek() | Kontroluje, či akýkoľvek bit je nastaviť . |
| žiadny() | Kontroluje, či žiadny bit je nastaviť. |
| všetko() | Skontrolujte, či všetky bit je nastaviť. |
| veľkosť () | Vráti veľkosť bitsetu. |
| natiahnuť() | Konvertuje bitset na std::string. |
| nasledovať() | Konvertuje bitset na unsigned long. |
| to_ullong() | Konvertuje bitset na unsigned long long. |
Prí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ýkon
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 sa používa na tlač true a false namiesto 1 alebo 0 pre boolovské hodnoty a noboolalpha pre opačné.
Operátori std::bitset
Niektoré zo základných operátorov sú pre prácu s bitsetovými objektmi preťažené. Nasleduje zoznam týchto operátorov:
| Operátor | Prevádzka |
|---|---|
| [] | Prístup operátor |
| & | Bitovo A |
| | | Bitovo ALEBO |
| ! | Bitovo ZADARMO |
| >>= | Binárne Pravý posun a priradiť |
| < <= | Binárne Lavy shift a priradiť |
| &= | Priraďte hodnotu bitovej hodnoty A do prvého bitsetu. |
| |= | Priraďte hodnotu bitovej hodnoty ALEBO do prvého bitsetu. |
| ^= | Priraďte hodnotu bitovej hodnoty ZADARMO do prvého bitsetu. |
| ~ | Bitovo NIE |
Prí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ýkon
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
Rozdiel medzi std::bitset a std::vector a poľom bool
Vektor bool a pole bool možno implementovať aj na ukladanie sekvencie boolovských hodnôt, ako je bitová množina, ale medzi každou implementáciou sú určité rozdiely:
| Parameter | bitset | vektor bool | pole bool |
|---|---|---|---|
| Definícia | Šablóna triedy pozostávajúca zo sekvencie bitov uložených tak, že každý bit zaberá 1 bit pamäte. | Variácia vektorov C++ STL, v ktorej má každý prvok veľkosť 1 bit a je typu bool | Súvislá kolekcia boolových dátových prvkov s pevnou veľkosťou. |
| Veľkosť | Pevná veľkosť. | Dynamická veľkosť. | Pevná veľkosť. |
| Pamäť | Jeden prvok zaberá 1 bit pamäte. | Jeden prvok zaberá 1 bit pamäte. | Jeden prvok zaberá 1 bajt pamäte. |
| Rýchlosť | To isté | To isté | Rýchlejšie |