Tirando de C++11 puedes probar algo así (por favor, abandona la versión de Borland del siglo pasado
):
Función para calcular un exponente. El modificador constexpr permite que el compilador pueda conocer el resultado en tiempo de compilación (y usar dicho valor en vez de llamar a la función).
Código C++:
Ver originalconstexpr unsigned long Exponente(int e)
{
return (e>0)? 10*Exponente(e-1) : 1;
}
Template para reelmplazar el dígito:
Código C++:
Ver originaltemplate<int D> unsigned long Reemplazar(unsigned long valor, unsigned nuevoDigito)
{
unsigned long superior = valor / Exponente(D+1);
unsigned long inferior = valor % Exponente(D);
return (superior*10+nuevoDigito)*Exponente(D) + inferior;
}
Y el uso:
Código C++:
Ver originalint main()
{
std::cout << Reemplazar<2>(123456,8) << '\n'; //123856
std::cout << Reemplazar<5>(111111,5) << '\n'; //511111
}
Aunque también se puede hacer sin template:
Código C++:
Ver originalunsigned long Reemplazar(unsigned long valor, unsigned indice, unsigned nuevoDigito)
{
unsigned long superior = valor / Exponente(indice+1);
unsigned long inferior = valor % Exponente(indice);
return (superior*10+nuevoDigito)*Exponente(indice) + inferior;
}
La diferencia básica es que al usar el template hay cálculos que se realizarán en tiempo de compilación... reduciendo el tiempo necesario para ejecutar la función.
Por otro lado, la lógica binaria no te sirve porque los números se almacenan en base 2 y cada dígito de la numeración base10 afecta a varios dígitos de la base 2... no hay operación binaria posible.
Un saludo.