Рубрики

C ++ bitset и его применение

Битовый набор представляет собой массив bool, но каждое логическое значение не сохраняется отдельно, вместо этого битовый набор оптимизирует пространство таким образом, что каждый логический объект занимает только 1 битное пространство, поэтому пространство, занимаемое битовым набором bs, меньше, чем у bool bs [N] и вектора bs ( N) Тем не менее, ограничение набора битов, N должно быть известно во время компиляции, то есть константа (это ограничение не существует с вектором и динамическим массивом)

Поскольку битовый набор хранит ту же информацию в сжатом виде, операции над битрейтом выполняются быстрее, чем с массивом и вектором. Мы можем получить доступ к каждому биту набора битов индивидуально с помощью оператора индексации массива [], то есть bs [3] показывает бит в индексе 3 набора битов bs, как простой массив. Помните, что битовый набор начинает свое индексирование в обратном направлении, то есть для 10110, 0 — это 0-й и 3-й индексы, а 1 — 1-й, 2-й и 4-й индексы.
Мы можем создать набор битов, используя целое число, а также двоичную строку через конструкторы, что показано в приведенном ниже коде. Размер набора битов фиксирован во время компиляции, то есть он не может быть изменен во время выполнения.
Основными функциями, определенными для класса битов, являются operator [], count, size, set, reset и многие другие. Они объяснены в следующем коде —

// C ++ программа для демонстрации различной функциональности bitset
#include <bits/stdc++.h>

using namespace std;

  
#define M 32

  

int main()

{

    // конструктор по умолчанию инициализируется со всеми битами 0

    bitset<M> bset1;

  

    // bset2 инициализируется с битами 20

    bitset<M> bset2(20);

  

    // bset3 инициализируется битами указанной двоичной строки

    bitset<M> bset3(string("1100"));

  

    // cout печатает точное представление битов bitset

    cout << bset1 << endl; // 00000000000000000000000000000000

    cout << bset2 << endl; // 00000000000000000000000000010100

    cout << bset3 << endl; // 00000000000000000000000000001100

    cout << endl;

  

    // объявляем set8 емкостью 8 бит

  

    bitset<8> set8; // 00000000

  

    // установка первого бита (или 6-го индекса)

    set8[1] = 1; // 00000010

    set8[4] = set8[1]; // 00010010

    cout << set8 << endl;

  

    // функция count возвращает количество установленных бит в битах

    int numberof1 = set8.count();

  

    // функция size возвращает общее количество бит в битах

    // так что разница даст нам номер unset (0)

    // биты в битах

    int numberof0 = set8.size() - numberof1;

  

    cout << set8 << " has " << numberof1 << " ones and "

         << numberof0 << " zeros\n";

  

    // тестовая функция возвращает 1, если бит установлен, иначе возвращает 0

    cout << "bool representation of " << set8 << " : ";

    for (int i = 0; i < set8.size(); i++)

        cout << set8.test(i) << " ";

  

    cout << endl;

  

    // любая функция возвращает true, если хотя бы 1 бит

    // установлено

    if (!set8.any())

        cout << "set8 has no bit set.\n";

  

    if (!bset1.any())

        cout << "bset1 has no bit set.\n";

  

    // ни одна функция не возвращает true, если ни один из битов

    // установлено

    if (!bset1.none())

        cout << "bset1 has some bit set\n";

  

    // bset.set () устанавливает все биты

    cout << set8.set() << endl;

  

    // bset.set (pos, b) делает bset [pos] = b

    cout << set8.set(4, 0) << endl;

  

    // bset.set (pos) делает bset [pos] = 1, то есть по умолчанию

    // равен 1

    cout << set8.set(4) << endl;

  

    // функция сброса делает все биты 0

    cout << set8.reset(2) << endl;

    cout << set8.reset() << endl;

  

    // функция flip переворачивает все биты, т.е. 1 <-> 0

    // и 0 <-> 1

    cout << set8.flip(2) << endl;

    cout << set8.flip() << endl;

  

    // Преобразование десятичного числа в двоичное с использованием набора битов

    int num = 100;

    cout << "\nDecimal number: " << num

         << "  Binary equivalent: " << bitset<8>(num);

  

    return 0;

}

Выход :

00000000000000000000000000000000
00000000000000000000000000010100
00000000000000000000000000001100

00010010
00010010 has 2 ones and 6 zeros
bool representation of 00010010 : 0 1 0 0 1 0 0 0 
bset1 has no bit set.
11111111
11101111
11111111
11111011
00000000
00000100
11111011

Decimal number: 100 Binary equivalent: 01100100

Для набора битов определены функции сброса и переключения. Функция set устанавливает (1) все биты набора битов, если аргумент не указан, в противном случае она устанавливает бит, позиция которого задается в качестве аргумента. Точно так же сброс и переворот также работают, если они вызываются без аргумента, они выполняют свою работу над всем набором битов, и если какая-то позиция предоставляется в качестве аргумента, то они выполняют операцию только в этой позиции.
Для битового набора все побитовые операторы перегружены, то есть они могут быть применены к битному набору напрямую без какого-либо преобразования или преобразования, основным перегруженным оператором являются &, |, ==,! = И оператор смещения <>, что облегчает работу с битрейтом.
Использование вышеуказанного оператора показано в приведенном ниже коде.

// C ++ программа для показа применимого оператора в битах.
#include <bits/stdc++.h>

using namespace std;

  

int main()

{

    bitset<4> bset1(9); // bset1 содержит 1001

    bitset<4> bset2(3); // bset2 содержит 0011

  

    // оператор сравнения

    cout << (bset1 == bset2) << endl; // ложь 0

    cout << (bset1 != bset2) << endl; // правда 1

  

    // побитовая операция и присваивание

    cout << (bset1 ^= bset2) << endl; // 1010

    cout << (bset1 &= bset2) << endl; // 0010

    cout << (bset1 |= bset2) << endl; // 0011

  

    // сдвиг влево и вправо

    cout << (bset1 <<= 2) << endl; // 1100

    cout << (bset1 >>= 1) << endl; // 0110

  

    // не оператор

    cout << (~bset2) << endl; // 1100

  

    // побитовый оператор

    cout << (bset1 & bset2) << endl; // 0010

    cout << (bset1 | bset2) << endl; // 0111

    cout << (bset1 ^ bset2) << endl; // 0101

}

Выход :

0
1
1010
0010
0011
1100
0110
1100
0010
0111
0101

Эта статья предоставлена Уткаршем Триведи. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

C ++ bitset и его применение

0.00 (0%) 0 votes