Модификация ответа DCP. Поведение является реализацией, определенной для отрицательных значений t. Он предоставляет все биты, даже ведущие нули. Стандартные предостережения касаются использования std::vector<bool>
и не являются надлежащим контейнером.
#include <vector> //for std::vector
#include <algorithm> //for std::reverse
#include <climits> //for CHAR_BIT
template<typename T>
std::vector<bool> convert(T t) {
std::vector<bool> ret;
for(unsigned int i = 0; i < sizeof(T) * CHAR_BIT; ++i, t >>= 1)
ret.push_back(t & 1);
std::reverse(ret.begin(), ret.end());
return ret;
}
И версия, которая также может работать со значениями с плавающей запятой. И, возможно, другие типы POD. Я действительно не проверял это вообще. Это может работать лучше для отрицательных значений, или это может работать хуже. Я не особо задумывался над этим.
template<typename T>
std::vector<bool> convert(T t) {
union {
T obj;
unsigned char bytes[sizeof(T)];
} uT;
uT.obj = t;
std::vector<bool> ret;
for(int i = sizeof(T)-1; i >= 0; --i)
for(unsigned int j = 0; j < CHAR_BIT; ++j, uT.bytes[i] >>= 1)
ret.push_back(uT.bytes[i] & 1);
std::reverse(ret.begin(), ret.end());
return ret;
}