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 байт пам'яті.
швидкість Те саме Те саме Швидше