С++ Битовые поля bitset

Для представления наборов битов и работы с ними используется стандартный шаблон класса bitset Объект класса bitset по умолчанию инициализируется нулями, но обычно у него есть инициализатор. Инициализаторами объектов класса bitset могут быть целые числа без знака или строки, состоящие из нулей и единиц.

Подробнее: bitset - C++ Reference

Требует включения заголовка: #include <bitset>


// bitset<РАЗМЕР_В_БИТАХ>(ИНИЦИАЛИЗИРУЮЩЕЕ_ЧИСЛО);

bitset<4> flaqs = 0хb;
// будет содержать одни нули
bitset<12345> lots;   
// будет содержать 112 нулей, за которыми следуют 16 явно заданных битов
bitset<128> dword_bits ( strinq("1010101010101010") };    
// std::invalid_argument
bitset<12345> mybits( strinq("hello") );  

К объектам класса bitset можно применять обычные операции над битами. Предположим, что переменные b1, b2 и bЗ являются объектами класса bitset


b1 = b2 & b3; // И
b1 = b2 | b3;  // Или
b1 = b2 ^ bЗ;   // xor
b1 = ~b2 ; // Дополнение
b1 = b2 << 2; // Сдвиг влево
b1 = b2 >> 3; // Сдвиг вправо 

Вывод двоичного представления символа 'c' :


cout << bitset<8>{'c'};

Считывая данные в объект класса bitset, поток ввода ищет нули и единицы Например при вводе числа 10121 - будут введены символы 101 , а символы 21 останутся в потоке.

Биты в объектах класса bitset нумеруются справа налево:

  7   6   5   4   3   2   1   0
[ 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 ]

учитывайте это при использовании оператора индексирования: 

b[7] == 1
b[0] == 0

Для числовых расчетов используйте знаковые целые числа (например, int). Для работы с битовыми наборами используйте беззнаковые целые числа (например, unsigned int).


Вы можете использовать целые беззнаковые числа вместо знаковых (включая обычную арифметику). но лучше этого избегать, так как это ненадежно и приводит к ошибкам


for (int i; cin >> i ; )
    cout << dec << i << " == " 
         << hex << "0х" << i << "=="
         << bitset<8 * sizeof(int)>(i) << '\n' ;