Примеры использования битовых полей. Двоичные данные при вводе-выводе

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

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

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

#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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий