#include <stdint.h>
#include <stdio.h>

template<int N> uint32_t bin2int32(const char* bin)
{
    return ( bin2int32<N/2>(bin) << (N/2) ) + bin2int32<N/2>( bin + (N/2) );
}

template<> uint32_t bin2int32<4>(const char* bin)
{
    uint32_t i = *(uint32_t*)bin;
    return ((i <<  3) & 0x08) +
           ((i >>  6) & 0x04) +
           ((i >> 15) & 0x02) +
           ((i >> 24) & 0x01);
}

template<int N> uint64_t bin2int64(const char* bin)
{
    return ( bin2int64<N/2>(bin) << (N/2) ) + bin2int64<N/2>( bin + (N/2) );
}

template<> uint64_t bin2int64<8>(const char* bin)
{
    uint64_t i = *(uint64_t*)bin;
    return ((i <<  7) & 0x80) +
           ((i >>  2) & 0x40) +
           ((i >> 11) & 0x20) +
           ((i >> 20) & 0x10) +
           ((i >> 29) & 0x08) +
           ((i >> 38) & 0x04) +
           ((i >> 47) & 0x02) +
           ((i >> 56) & 0x01);
}

#define bin2int bin2int32

int main()
{
	printf("0x%08X\n", bin2int<32>("00000001001000110100010101100111"));
	printf("0x%08X\n", bin2int<32>("10001001101010111100110111101111"));

	return 0;
}
