#include <iomanip>
#include <iostream>
#include <limits>
#include <sstream>
#include <string>

using value_type = unsigned long long;

std::string as_binary(value_type value)
{
    std::ostringstream os;

    if (value == 0)                         // no bits set
        os << value;
    else
    {
        // set mask's left-most bit.
        value_type mask = 
            value_type{1} << (std::numeric_limits<value_type>::digits - 1);

        while ((mask & value) == 0)         // skip leading 0 bits
            mask >>= 1;                     // shift our set bit to the right                    

        while (mask)
        {
            os << ((mask & value) ? 1 : 0);
            mask >>= 1;
        }
    }

    return os.str();
}

int main()
{
    for (value_type i = 0; i < 33; ++i)
    {
        std::cout << std::setw(2) << i;
        std::cout << " = ";
        std::cout << std::setw(6) << as_binary(i) << '\n';
    }
}