Puede añadir más parámetros de plantilla no de tipo "simular" bits adicionales:
// Utility metafunction used by top_bit<N>.
template <unsigned long long N1, unsigned long long N2>
struct compare {
enum { value = N1 > N2 ? N1 >> 1 : compare<N1 << 1, N2>::value };
};
// This is hit when N1 grows beyond the size representable
// in an unsigned long long. It's value is never actually used.
template<unsigned long long N2>
struct compare<0, N2> {
enum { value = 42 };
};
// Determine the highest 1-bit in an integer. Returns 0 for N == 0.
template <unsigned long long N>
struct top_bit {
enum { value = compare<1, N>::value };
};
template <unsigned long long N1, unsigned long long N2 = 0>
struct binary {
enum {
value =
(top_bit<binary<N2>::value>::value << 1) * binary<N1>::value +
binary<N2>::value
};
};
template <unsigned long long N1>
struct binary<N1, 0> {
enum { value = (N1 % 10) + 2 * binary<N1/10>::value };
};
template <>
struct binary<0> {
enum { value = 0 } ;
};
Usted puede utilizar esto como antes, por ejemplo:
binary<1001101>::value
Pero también se puede utilizar el siguiente formas equivalentes:
binary<100,1101>::value
binary<1001,101>::value
binary<100110,1>::value
Básicamente, el parámetro adicional le brinda otros 20 bits para jugar. Puede agregar incluso más parámetros si es necesario.
Dado que el valor posicional del segundo número se usa para determinar qué tan lejos a la izquierda debe desplazarse el primer número, el segundo número debe comenzar con 1. (Esto se requiere de todos modos, ya que se inicia con 0 haría que el número se interpretara como un número octal.)
El límite de 20 es probablemente dependiente del compilador. Depende de cuánta recursión de plantilla tolerará. Algunos compiladores modernos le permitirán pasar un argumento para establecer la máxima profundidad de recursión de la plantilla. –
Pensé que el límite se debía a la cantidad de dígitos decimales que podía almacenar en un largo sin signo, ya que básicamente toma el número * decimal * 101011011 y lo convierte en binario, ¿sí? – paxdiablo
Pax: sí, al menos para GCC que estoy usando. – Unknown