int
nie posiada 32 bitów. Rozmiar int
jest definiowany przez implementację, ale powinien to być typ "naturalny" dla danej platformy sprzętowej. Jest też jedno wymaganie: int
musi mieć minimum 16 bitów. Na dodatek nie wiadomo też ile bitów ma bajt, to również jest definiowane przez implementację, ale musi to być minimum 8.
Dlatego dobrze najpierw zrobić sobie coś, co uniwersalnie zwróci nam ile bitów ma dany typ. Np. taki szablon zmiennej:
template <typename T>
constexpr std::size_t bitsInType = sizeof(T) * CHAR_BIT;
sizeof
zwraca rozmiar w bajtach, a CHAR_BIT
mówi ile bitów jest w bajcie.
Teraz możemy zastanowić się nad kodem, który wyprodukuje tekstowy zapis jej binarnej reprezentacji. W C++ można wykorzystać do tego klasę std::bitset
. Może przyjąć ona wartość liczbową bezpośrednio w konstruktorze i zwrócić std::string
za pomocą metody to_string
. Czyli w sumie to jedna linijka:
std::bitset<bitsInType<int>>(value).to_string();
Parametrem szablonu jest rozmiar bitset
u - w naszym wypadku tyle, ile jest bitów w int
.
To wszystko można złożyć w prosty kod:
template <typename T>
constexpr std::size_t bitsInType = sizeof(T) * CHAR_BIT;
template <typename T>
std::string binaryReprestation(T value) {
static_assert(std::is_integral<T>::value, "Value needs to be integral");
return std::bitset<bitsInType<T>>(value).to_string();
}
Za pomocą static_assert
upewniamy się, że typ użyty w funkcji (parametr szablonu) to jeden z wbudowanych typów całkowitoliczbowych - tylko takie można przekazać do konstruktora std::bitset
.
Przykład: http://ideone.com/oRmtQ8