C++ bitset та його застосування
Набір бітів — це масив логічних значень, але кожне логічне значення не зберігається в окремому байті, а набір бітів оптимізує простір таким чином, що кожне логічне значення займає лише 1 біт , так простір, зайнятий бітовим набором, менший, ніж масив bool або вектор bool .
Обмеження бітового набору полягає в тому розмір має бути відомий під час компіляції, тобто розмір набору бітів фіксований.
std::bitset це шаблон класу для бітового набору, який визначено всередині файл заголовка тому нам потрібно включити файл заголовка перед використанням bitset у нашій програмі.
Синтаксис:
bitset variable_name(initialization);
Ми можемо ініціалізувати бітсет трьома способами:
1. Неініціалізовано: Усі біти будуть встановлені на нуль.
bitset variable_name;
2. Ініціалізація десятковим цілим числом: Bitset представлятиме дане десяткове число в двійковій формі.
bitset variable_name(DECIMAL_NUMBER);
3. Ініціалізація двійковим рядком: Bitset представлятиме заданий двійковий рядок.
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); приклад:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>uninitializedBitset; // ініціалізація бітовим набором десяткових чисел <8>decimalBitset(15); // ініціалізація бінарним набором рядків <8>stringBitset(string('1111')); cout < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } Вихід
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
Функції-члени std::bitset
Клас std::bitset містить деякі корисні функції-члени для роботи з об’єктами bitset. Ось список деяких функцій-членів std::bitset:
| Назва функції | Опис функції |
|---|---|
| набір() | Встановіть бітове значення за вказаним індексом до 1 . |
| reset() | Встановіть бітове значення за заданим індексом до 0 . |
| flip() | Перевернути значення біта за вказаним індексом. |
| рахувати() | Рахувати Кількість встановити біти . |
| тест() | Повертає логічне значення за вказаним індексом . |
| будь-який() | Перевіряє, якщо будь-який біт є встановити . |
| немає() | Перевіряє, якщо немає біт є встановити. |
| все() | Перевірте, якщо все біт є встановити. |
| розмір() | Повертає розмір біта. |
| to_string() | Навертає набір бітів у std::string. |
| слідувати() | Навертає бітовий до unsigned long. |
| to_ullong() | Навертає бітовий до unsigned long long. |
приклад:
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; } Вихід
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
Примітка: boolalpha використовується для друку істини та хибності замість 1 або 0 для логічних значень і noboolalpha для протилежних.
Оператори std::bitset
Деякі з базових операторів перевантажені для роботи з об’єктами бітового набору. Нижче наведено список цих операторів:
| Оператор | Операція |
|---|---|
| [] | Доступ оператор |
| & | Побітово І |
| | | Побітово АБО |
| ! | Побітово БЕЗКОШТОВНО |
| >>= | Двійковий Правий зсув і призначити |
| < <= | Двійковий Зрушення вліво і призначити |
| &= | Присвоїти значення порозрядно І до першого біта. |
| |= | Присвоїти значення порозрядно АБО до першого біта. |
| ^= | Присвоїти значення порозрядно БЕЗКОШТОВНО до першого біта. |
| ~ | Побітово НІ |
приклад:
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;
Вихід
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
Різниця між std::bitset і std::vector і масивом bool
Вектор логічного значення та масив логічного значення також можуть бути реалізовані для зберігання послідовності логічних значень, як-от набір бітів, але є деякі відмінності між кожною реалізацією:
| Параметр | набір бітів | вектор бул | масив bool |
|---|---|---|---|
| Визначення | Шаблон класу, що складається з послідовності бітів, збережених таким чином, що кожен біт займає 1 біт пам’яті. | Варіант векторів C++ STL, у якому кожен елемент має розмір 1 біт і тип bool | Безперервна колекція елементів даних bool фіксованого розміру. |
| Розмір | Фіксований розмір. | Динамічний розмір. | Фіксований розмір. |
| Пам'ять | Один елемент займає 1 біт пам'яті. | Один елемент займає 1 біт пам'яті. | Один елемент займає 1 байт пам'яті. |
| швидкість | Те саме | Те саме | Швидше |