Re: convert binary to decimal in template at compiler time.
Leo jay wrote:
i'd like to implement a class template to convert binary numbers to
decimal at compile time.
and my test cases are:
BOOST_STATIC_ASSERT((bin<1111,1111,1111,1111>::value == 65535));
BOOST_STATIC_ASSERT((bin<1111>::value == 15));
BOOST_STATIC_ASSERT((bin<0>::value == 0));
BOOST_STATIC_ASSERT((bin<1010, 0011>::value == 163));
you can find my implementation at:
http://pastebin.org/2271
the first three cases were ok, but the last one failed, because,
compiler will parse 0011
as a octal number 9, instead of decimal number 11 because of the
leading 0s.
to resolve this, i defined 4 macros:
#define BIN1(a) bin<9##a>::value
#define BIN2(a, b) bin<9##a, 9##b>::value
#define BIN3(a, b, c) bin<9##a, 9##b, 9##c>::value
#define BIN4(a, b, c, d) bin<9##a, 9##b, 9##c, 9##d>::value
these macros could pass the last test case, but it's not good enough
that i have to specify how many numbers i will input.
is there any elegant way to resolve this?
combining your implementation and Kai's from else thread
// specialization for byte starting with 0
// 0000 and 0001 is no need specialized
template <>
struct bin1 <0010>
{
static const unsigned int value = 2u;
};
template <>
struct bin1 <0011>
{
static const unsigned int value = 3u;
};
template <>
struct bin1 <0100>
{
static const unsigned int value = 4u;
};
template <>
struct bin1 <0101>
{
static const unsigned int value = 5u;
};
template <>
struct bin1 <0110>
{
static const unsigned int value = 6u;
};
template <>
struct bin1 <0111>
{
static const unsigned int value = 7u;
};
then
bin<0010, 0001>::value == bin<10, 1>::value
--
Thanks
Barry