Как преобразовать любое значение в вектор <bool> - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь преобразовать любой объект в std::vector<bool> (представляющий биты, установленные в памяти, чтобы обработать объект).

Итак, для uint16_t(0x1234) я хочу получить std::vector<bool> ‭0001001000110100 , И для float(3.14f), то есть 0x4048F5C3‬ в памяти, я хочу получить std::vector<bool> ‭‭01000000010010001111010111000011.

На основании этого поста , я пробовал это:

template<typename T>
std::vector<bool> val2Array(T val)
{
    size_t count = sizeof(T)*CHAR_BIT;
    std::vector<bool> result( count );
    for (size_t i = 0; i < count; i++)
    {
        T temp = 1 << (count - i - 1);
        if ( val & temp )
            result[i] = true;
        else
            result[i] = false;
    }

    return result;
}

Это работает нормально, но я получаю ошибку, когда T не является числовым (float), из-за оператора <<.

Есть ли какой-либо другой способ конвертировать любой значение до std::vector<bool>? Я нашел много кода, показывающего, как преобразовать std::vector<bool> в значение, но не наоборот.

1 Ответ

0 голосов
/ 23 марта 2020

То, что вы описали, напоминает мне о reinterpret_cast. Вы просто хотите видеть биты независимо от их базовой интерпретации, поэтому переосмыслите эти биты как нечто, что std::bitset может принять и поместить их в ваш вектор.

#include <bitset>
#include <vector>
#include <iostream>

constexpr int CHAR_BIT = 8;

template<typename T>
std::vector<bool> val2Array(T val)
{
    uintmax_t i = reinterpret_cast<uintmax_t&>(val);
    auto bits = std::bitset<sizeof(uintmax_t)*CHAR_BIT>(i);

    size_t count = sizeof(T)*CHAR_BIT;
    std::vector<bool> result( count );

    for(size_t i = 0; i < count; ++i)
        result[count-i-1] = bits[i];

    return result;
}

int main()
{
    auto i = uint16_t(0x1234);
    auto iv = val2Array(i);
    for(auto&& e : iv) std::cout << e;
    std::cout << std::endl;


    auto f = float(3.14f);
    auto fv = val2Array(f);
    for(auto&& e : fv) std::cout << e;
    std::cout << std::endl;
}

output

0001001000110100
01000000010010001111010111000011

Для преобразования bitset в vector я нашел запись , в которой цитируется пост для bitset_iterator, который может быть полезен

...