C++ bitų rinkinys ir jo taikymas
Bitų rinkinys yra loginių elementų masyvas, tačiau kiekviena loginė reikšmė nėra saugoma atskirame baite, bitų rinkinys optimizuoja erdvę taip, kad kiekviena loginė reikšmė užima tik 1 bito vietos , taip bitų rinkinio užimama erdvė yra mažesnė nei bool masyvo arba bool vektoriaus .
Bitų rinkinio apribojimas yra tas dydis turi būti žinomas kompiliavimo metu, ty bitų rinkinio dydis yra fiksuotas.
std::bitset yra viduje apibrėžto bitų rinkinio klasės šablonas antraštės failą todėl prieš naudodami bitų rinkinį savo programoje turime įtraukti antraštės failą.
Sintaksė:
bitset variable_name(initialization);
Mes galime inicijuoti bitų rinkinį trimis būdais:
1. Neinicializuotas: Visi bitai bus nustatyti į nulį.
bitset variable_name;
2. Inicijuoti sveikuoju dešimtainiu skaičiumi: Bitset pateiks nurodytą dešimtainį skaičių dvejetaine forma.
bitset variable_name(DECIMAL_NUMBER);
3. Inicijavimas naudojant dvejetainę eilutę: Bitset atstovaus duotą dvejetainę eilutę.
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); Pavyzdys:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>uninitializedBitset; // inicijavimas naudojant dešimtainių skaičių bitų rinkinį <8>dešimtainis bitų skaičius (15); // inicijavimas naudojant dvejetainės eilutės bitų rinkinį <8>stringBitset(string('1111')); cout < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } Išvestis
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
std::bitset Narių funkcijos
std::bitset klasėje yra keletas naudingų narių funkcijų, skirtų dirbti su bitų rinkinio objektais. Čia yra kai kurių std::bitset narių funkcijų sąrašas:
| Funkcijos pavadinimas | Funkcijos aprašymas |
|---|---|
| rinkinys () | Nustatyti bitų vertė esant nurodytam indeksui iki 1 . |
| iš naujo () | Nustatyti bitų vertė esant tam tikram indeksui iki 0 . |
| apversti () | Apverskite bitų vertę esant nurodytam indeksui. |
| skaiciuoti () | Suskaičiuoti skaičius nustatyti bitai . |
| testas () | Grąžina loginė vertė esant nurodytam indeksui . |
| bet koks () | Patikrina, ar bet koks bitas yra rinkinys . |
| nė vienas() | Patikrina, ar nė vienas bitas yra rinkinys. |
| visi () | Patikrinkite, ar visi bitas yra rinkinys. |
| dydis () | Grąžina bitų rinkinio dydis. |
| to_string() | Konvertuoja bitų rinkinys į std::string. |
| Sekti() | Konvertuoja bitų rinkinys iki nepasirašyto ilgio. |
| to_ullong () | Konvertuoja bitset to unsigned long long. |
Pavyzdys:
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; } Išvestis
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
Pastaba: „Boolalpha“ naudojama spausdinti „true“ ir „false“, o ne 1 arba 0 loginėms reikšmėms, o noboolalpha – priešingai.
std::bitset operatoriai
Kai kurie pagrindiniai operatoriai yra perkrauti dirbti su bitų rinkinio objektais. Toliau pateikiamas šių operatorių sąrašas:
| operatorius | Operacija |
|---|---|
| [] | Prieiga operatorius |
| & | Bitiškai IR |
| | | Bitiškai ARBA |
| ! | Bitiškai LAISVAS |
| >>= | Dvejetainis Dešinysis posūkis ir priskirti |
| < <= | Dvejetainis Kairė pamaina ir priskirti |
| &= | Priskirkite bitų reikšmę IR į pirmąjį bitų rinkinį. |
| |= | Priskirkite bitų reikšmę ARBA į pirmąjį bitų rinkinį. |
| ^= | Priskirkite bitų reikšmę LAISVAS į pirmąjį bitų rinkinį. |
| ~ | Bitiškai NE |
Pavyzdys:
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;
Išvestis
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
Skirtumas tarp std::bitset ir std::vector ir bool masyvo
Būlio vektorius ir bool masyvas taip pat gali būti įgyvendinami, kad būtų saugoma loginių reikšmių seka, pvz., bitų rinkinys, tačiau yra keletas skirtumų tarp kiekvieno įgyvendinimo:
| Parametras | bitų rinkinys | bool vektorius | masyvas bool |
|---|---|---|---|
| Apibrėžimas | Klasės šablonas, susidedantis iš bitų sekos, saugomų taip, kad kiekvienas bitas užimtų 1 bitą atminties. | C++ STL vektorių variantas, kuriame kiekvienas elementas yra 1 bito dydžio ir bool tipo | Fiksuoto dydžio gretimas bool duomenų elementų rinkinys. |
| Dydis | Fiksuotas dydis. | Dinaminis dydis. | Fiksuotas dydis. |
| Atmintis | Vienas elementas užima 1 bitą atminties. | Vienas elementas užima 1 bitą atminties. | Vienas elementas užima 1 baitą atminties. |
| Greitis | Tas pats | Tas pats | Greičiau |