На этом шаге мы рассмотрим еще один пример использования битовых полей.
Другая полезная возможность битовых полей - преобразование целых чисел в последовательность битов и наоборот. Задача решается простым созданием временного битового поля:
//--------------------------------------------------------------------------- #include <vcl.h> #include <bitset> #include <iostream> #include <string> #include <limits> #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() { // Вывод чисел в двоичном представлении cout << ToRus("267 как двоичное короткое: ") << bitset<numeric_limits<unsigned short>::digits>(267) << endl; cout << ToRus("267 как двоичное длинное: ") << bitset<numeric_limits<unsigned long>::digits>(267) << endl; cout << ToRus("10,000,000 как 24-битное значение: ") << bitset<24>(1e7) << endl; // Преобразование двоичного представления в целое число cout << ToRus("\"1000101011\" как целое: ") << bitset<100>(string("1000101011")).to_ulong() << endl; getch(); return 0; } //---------------------------------------------------------------------------
В зависимости от разрядности типов short и long примерный результат выглядит так:
Рис.1. Результат работы приложения
В этом примере следующая конструкция преобразует число 267 в битовое поле, количество битов в котором определяется числом типа unsigned short:
bitset<numeric_limits<unsigned short>::digits>(267)
Оператор вывода bitset выводит содержимое битового поля в виде последовательности нулей и единиц.
Аналогично, представленная ниже конструкция преобразует серию двоичных цифр в битовое поле, которое преобразуется в целое число вызовом to_ ulong():
bitset<100>(string("1000101011"))
Обратите внимание: количество битов в битовом поле должно быть меньше sizeof(unsigned long). Если значение битового поля не может быть представлено в виде unsigned long, генерируется исключение.
На следующем шаге мы рассмотрим строение класса bitset.