Общий вопрос о возможных будущих возможностях языка C ++ или стандартной библиотеки в отношении битовых потоков - PullRequest
0 голосов
/ 25 февраля 2020

Есть ли упоминания о наличии указанного c bitstream объекта в будущем выпуске C ++, помимо C ++ 20 или в стандартной библиотеке? Например; у нас может быть объект std::bitset<n>, где n - это постоянное известное интегральное значение.

Псевдо-пример:

#include <bitstream>

template<unsigned N>
class Foo {
public:
     std::bitset<N> bits_;
};

Здесь у нас есть шаблон класса, который будет указывать, сколько битов в объекте std::bitset. Что хорошо.

У нас также есть stream объекты, такие как iostream, fstream, sstream и др. c. где мы можем передавать значения различных типов данных в эти потоки, либо читая, либо записывая их в поток строк, поток файлов, поток ввода-вывода на консоль или терминал и т. д. c ...


Что я хотел бы знать, есть ли предложение иметь объект потока, подобный приведенному выше, но указать c для произвольной последовательности битов, аналогичной природе std::bitset, где вы можете передать набор битов в поток. Например, это может выглядеть примерно так:

#include <bitset>
#include <bitstream> // not an actual library - only suggestive

int main() {
    std::bitset<8>  byte{0xFE};
    std::bitset<16> word{0xFEDC};
    std::bitset<32> dword{0xFEDCBA98};
    std::bitset<64> qword{0xFEDCBA9876543210};

    std::bitstream bs;
    bs << byte << word << dword << qword;
    std::cout << bs; 
    return 0;
}

Здесь ожидаемый результат будет выглядеть следующим образом:

11111110111111101101110011111110110111001011101010011000111111101101110010111010100110000111011001010100001100100001000

В зависимости от порядкового номера предполагаемого использования ...


Поворот также будет применим. Если бы у нас уже был заполненный объект bitstream, такой как в примере выше, мы могли бы извлечь определенные c битовые последовательности из bitstream следующим образом:

#include <bitset>
#include <bitstream> // not an actual library - only suggestive
#include <iomanip>  // manipulators for bitstreams not yet implemented...

int main() {
    std::bitset<8>  byte{0xFE};
    std::bitset<16> word{0xFEDC};
    std::bitset<32> dword{0xFEDCBA98};
    std::bitset<64> qword{0xFEDCBA9876543210};

    std::bitstream bs;
    bs << byte << word << dword << qword;

    std::bitset<3> odd3;
    std::bitset<5> odd5;
    std::bitset<7> odd7;

    bs >> bs::msb >> odd3 >> odd7 >> odd5;
    std::cout << odd3 << '\n' << odd7 << '\n' << odd5;

    bs >> bs::lsb >> odd5 << odd3 << odd7;
    std::cout << odd5 << '\n' << odd3 << '\n' << odd7;

    // Or by using a constructor with a value for the bit size...
    std::bitset<9> odd9( bs ); // odd9(bs::msb), odd9(bs::lsb)... 

    return 0;
}

И ожидаемые результаты вытянули бы биты из направлений MSB или LSB на величину размера bitset объекта соответственно.


Точно так же, как iostream и другие библиотеки потоков, используя библиотеку <iomanip>, которую мы может иметь модификаторы форматирования, которые будут разбивать этот ввод или вывод на дискретные bit-segments любой заданной длины, например каждые 4 или 8 бит, или отображать его как шестнадцатеричное, et c ... Все операции с битами и вычисления все равно будут быть ответственным std::bitset.

Возможность извлекать sh или извлекать произвольные bitset объекты в и из bitstream объекта, который будет совместим со всеми другими stream подобными объектами, может быть очень мощным и полезным инструмент или функция.

Есть ли упоминание о чем-то подобном или уже существует что-то похожее на эту природу без необходимости конвертировать туда и обратно между строками или другими типами, и т.д. c.?


EDIT -User- walnut привел несколько замечательных примеров в своем ответе относительно этого и того, что это уже можно сделать с использованием существующих iostream объектов и операторов , Вы можете прочитать его ответ и комментарии в обсуждении, однако я просто хотел проиллюстрировать свои соображения относительно библиотеки объектов stream, которая написана и предназначена для явной и конкретной работы с bitset типами данных.

Представьте себе такую ​​функцию:

// Not written with perfect syntax or compilation in mind,
// only psuedo to illustrate a point.
template<typename... T>
std::ostream& concatinateBitSequences( T&& ... t ) { // assuming all t are bitset<n>
    std::stringstream sstream;
    sstream << t...;
    return sstream; 
}

и сравните ее тоже ...

// Not written with perfect syntax or compilation in mind,
// only psuedo to illustrate a point.
template<typename... T>
std::bitstream& concatinateBitSequences( T&& ... t ) { // assuming all t are bitset<n>
   std::bitstream bs;
   bs << t...;
   return bs;
}

Вызывающий пользователь знает, что он возвращает bitstream явно или специально по сравнению с произвольным stream объектом! Это было моим основным намерением или целью ... Это больше ориентировано на удобочитаемость и более выразительно в коде, показывающем правильные намерения. Кроме того, он будет тесно связан с объектами bitset, что означает, что объект bitstream будет принимать только данные, поступающие из bitset s или других bitstream объектов, но он может передавать свои данные в bitset s, bitstream с или другие stream объекты.

1 Ответ

1 голос
/ 25 февраля 2020

Это уже работает так, как вы намеревались:

std::cout << byte << word << dword << qword;

и

std::cin >> odd5 >> odd3 >> odd7;

Для промежуточного хранения можно просто использовать std::stringstream, что также будет работать так, как вы описываете.

Однако здесь нет порядка байтов, потому что операции выполняются по битам, а не по байтам.

...