Шаг 350.
Библиотека STL. Специальные контейнеры. Битовые поля. Примеры использования битовых полей. Двоичные данные при вводе-выводе

    На этом шаге мы рассмотрим еще один пример использования битовых полей.

    Другая полезная возможность битовых полей - преобразование целых чисел в последовательность битов и наоборот. Задача решается простым созданием временного битового поля:

//---------------------------------------------------------------------------

#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, генерируется исключение.


   Замечание. Отметим необходимость явного преобразования исходного значения к типу string. Вероятно, это объясняется ошибкой в стандарте, поскольку в ранних версиях стандарта допускалось использование конструкций вида bitsetd("1000101011"). При преобразовании конструктора в шаблон для разных строковых типов этот механизм автоматического преобразования типа был случайно утрачен. В настоящее время рассматривается предложение по исправлению этой ошибки.

    На следующем шаге мы рассмотрим строение класса bitset.




Предыдущий шаг Содержание Следующий шаг