#include <iostream>
#include <bitset>
#include <cstddef>



const size_t CHAR_SIZE = 8;
template <typename T, size_t bitsCount = sizeof(T) * CHAR_SIZE>
T reverse(T original)
{
	T result = 0;

    std::bitset<bitsCount> bN(original);
    std::bitset<bitsCount> bR(result);
    std::cerr << "Original: " << bN << "\tResult: " << bR << "\n";
    for (size_t i = 0; i < bitsCount; ++i)
    {
        result = result << 1;
        
        T rightBit = (original & 0x01);
        result = rightBit | result;
        
        original = original >> 1;
        std::bitset<bitsCount> bN(original);
        std::bitset<bitsCount> bR(result);
        std::cerr << "Original: " << bN << "\tResult: " << bR << "\n";
    }

    return result;
}

int main()
{
	reverse(5);
}