c++ - tipos - que es long en programacion
Imprimir manualmente un entero de N-byte (2)
¿Qué es un algoritmo escalable para imprimir manualmente un entero de N-dígitos binarios cuyo valor no cabe en long long
? Sé que printf
y sus amigos, junto con <iostream>
(lo que muy probablemente son los piggy-backs de <cstdio>
tienen este incorporado para los tipos estándar, pero me gustaría hacerlo para un entero compuesto por N bytes.
He pensado en esto y busqué en Google un poco, pero siempre se reduce a usar una libigery bigint preexistente como GMP (una base de código con la que no estoy familiarizado) o "use printf" o la más útil "esto es difícil" .
El número entero es básicamente:
template<size_t N>
class Integer{
...
private:
int8_t first;
uint8_t rest[N-1];
}
así que al reinterpretar los bytes de un Integer<4>
obtendría un int32_t
. Me gustaría escalar esto a N> 8. La eficiencia no es realmente mi preocupación en este momento. Tampoco lo es endianness (esto es para x86).
Paso 1: defina una tabla de búsqueda que contenga potencias de dos en formato de cadena:
const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...};
Paso 2: Escribe una función que agrega dos números en formato de cadena.
Paso 3: itere a través de los bits en su número y agregue todas las cadenas correspondientes a los 1 bits.
Paso 4: Imprime el resultado.
Usé este enfoque yo mismo para imprimir números de coma flotante muy grandes, y funcionó bien para mí.
Un algoritmo recursivo básico para generar un número decimal:
void negate(Integer & number); // modifies the input
int divide_by_10(Integer & number); // modifies the input
bool is_zero(const Integer & number);
void output_number(Integer number)
{
if (number.first < 0)
{
cout << "-";
negate(number);
}
if (is_zero(number))
{
cout << "0";
return;
}
int remainder = divide_by_10(number);
if (!is_zero(number))
output_number(number);
char digit[] = {''0'', 0};
digit[0] += remainder;
cout << digit;
}
Dejé las funciones auxiliares indefinidas por ahora, quizás esto es suficiente.