На этом шаге мы приведем пример использования битовых полей.
В первом примере битовое поле интерпретируется как набор флагов. Каждый флаг представлен некоторым значением перечисляемого типа, определяющим позицию бита в поле. В нашем примере биты представляют различные цвета; таким образом, каждое значение перечисляемого типа определяет один цвет. Битовые поля являются удобным средством для работы с переменными, содержащими произвольную комбинацию цветов:
//--------------------------------------------------------------------------- #include <vcl.h> #include <bitset> #include <iostream> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } int main() { // Перечислимый тип для задания битов // - каждый бит определяет цвет enum Color { red, yellow, green, blue, white, black, //..., numColors }; // Создание битового поля для всех битов/цветов bitset<numColors> usedColors; // Установка битов двух цветов usedColors.set(red); usedColors.set(blue); // Вывод данных битового поля cout << "bitfield of used colors: " << usedColors << endl; cout << "number of used colors: " << usedColors.count() << endl; cout << "bitfield of unused colors: " << ~usedColors << endl; // Если в битовом поле использован хотя бы один цвет... if (usedColors.any()) { // перебрать все цвета в цикле for (int c = 0; c < numColors; ++c) { // Если флаг текущего цвета установлен... if (usedColors[(Color)c]) { //... } } } } //---------------------------------------------------------------------------
На следующем шаге мы рассмотрим еще один пример использования битовых полей.