Bitset C++ i jego zastosowanie
Bitset to tablica booli, ale każda wartość logiczna nie jest przechowywana w oddzielnym bajcie, bitset optymalizuje przestrzeń w taki sposób, że każda wartość logiczna zajmuje tylko 1-bitową przestrzeń , Więc miejsce zajmowane przez bitset jest mniejsze niż tablica bool lub wektor bool .
Ograniczeniem zestawu bitów jest to rozmiar musi być znany w czasie kompilacji, tj. rozmiar zestawu bitów jest stały.
std::bitset jest szablonem klasy dla zestawu bitów, który jest zdefiniowany wewnątrz plik nagłówkowy dlatego musimy dołączyć plik nagłówkowy przed użyciem bitsetu w naszym programie.
Składnia:
bitset variable_name(initialization);
Bitset możemy zainicjować na trzy sposoby:
1. Niezainicjowane: Wszystkie bity zostaną ustawione na zero.
bitset variable_name;
2. Inicjalizacja dziesiętną liczbą całkowitą: Bitset będzie reprezentował podaną liczbę dziesiętną w postaci binarnej.
bitset variable_name(DECIMAL_NUMBER);
3. Inicjalizacja ciągiem binarnym: Bitset będzie reprezentował dany ciąg binarny.
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); Przykład:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>niezainicjowanyBitset; // inicjalizacja z zestawem bitów liczb dziesiętnych <8>dziesiętnyBitset(15); // inicjalizacja za pomocą bitsetu ciągu binarnego <8>stringBitset(string('1111')); cout < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } Wyjście
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
std::bitset Funkcje członkowskie
Klasa std::bitset zawiera kilka przydatnych funkcji składowych do pracy na obiektach bitset. Oto lista niektórych funkcji składowych std::bitset:
| Nazwa funkcji | Opis funkcji |
|---|---|
| ustawić() | Ustaw wartość bitowa przy danym indeksie do 1 . |
| Resetowanie() | Ustaw wartość bitowa przy danym indeksie do 0 . |
| trzepnięcie() | Odwróć wartość bitu przy danym indeksie. |
| liczyć() | Liczyć Liczba ustawić bity . |
| test() | Zwraca wartość logiczna przy danym indeksie . |
| każdy() | Sprawdza, czy każdy trochę jest ustawić . |
| nic() | Sprawdza, czy nic trochę jest ustawić. |
| Wszystko() | Sprawdź, czy Wszystko trochę jest ustawić. |
| rozmiar() | Zwraca rozmiar zestawu bitów. |
| to_string() | Nawraca bitset na std::string. |
| podążać() | Nawraca bitset na unsigned long. |
| to_ullong() | Nawraca bitset na unsigned long long. |
Przykład:
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; } Wyjście
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
Notatka: boolalpha służy do wypisywania prawdy i fałszu zamiast 1 lub 0 dla wartości logicznych i noboolalpha dla wartości przeciwnych.
Operatory std::bitset
Niektóre z podstawowych operatorów są przeciążone do pracy z obiektami bitsetowymi. Poniżej znajduje się lista tych operatorów:
| Operator | Operacja |
|---|---|
| [] | Dostęp operator |
| & | Bitowe I |
| | | Bitowe LUB |
| ! | Bitowe BEZPŁATNY |
| >>= | Dwójkowy Prawe przesunięcie i przypisz |
| < <= | Dwójkowy Przesunięcie w lewo i przypisz |
| &= | Przypisz wartość bitową I do pierwszego bitsetu. |
| |= | Przypisz wartość bitową LUB do pierwszego bitsetu. |
| ^= | Przypisz wartość bitową BEZPŁATNY do pierwszego bitsetu. |
| ~ | Bitowe NIE |
Przykład:
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;
Wyjście
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
Różnica między std::bitset i std::vector a tablicą bool
Wektor bool i tablica bool można również zaimplementować do przechowywania sekwencji wartości logicznych, takich jak bitset, ale istnieją pewne różnice między każdą implementacją:
| Parametr | bitset | wektor boola | tablica bool |
|---|---|---|---|
| Definicja | Szablon klasy składający się z sekwencji bitów przechowywanych w taki sposób, że każdy bit zajmuje 1 bit pamięci. | Odmiana wektorów C++ STL, w której każdy element ma rozmiar 1 bita i jest typu bool | Ciągła kolekcja elementów danych bool o stałym rozmiarze. |
| Rozmiar | Stały rozmiar. | Rozmiar dynamiczny. | Stały rozmiar. |
| Pamięć | Pojedynczy element zajmuje 1 bit pamięci. | Pojedynczy element zajmuje 1 bit pamięci. | Pojedynczy element zajmuje 1 bajt pamięci. |
| Prędkość | To samo | To samo | Szybciej |