Converte um número muito grande de binário para decimal e imprimi-lo
Pergunta
Eu sei como converter binário para decimal. Eu sei que pelo menos 2 métodos: mesa e poder; -)
Eu quero converter binário para decimal e imprimir este decimal. Além disso, eu não estou interessado neste `decimal '; Quero apenas para imprimi-lo.
Mas, como eu escrevi acima, eu sei apenas 2 métodos para binário converter para decimal e ambos necessários disso. Então, eu estou computação algum valor para 1 ou 0 em binário e adicioná-lo ao valor lembrado. Este é um lugar fino. Eu tenho um número realmente, realmente grande (1 e 64 zeros). Durante a conversão eu preciso colocar algum resultado intermediário em alguns 'variável'. Em C, I tem um tipo `int', que é apenas 4 bytes e não mais do que 10 ^ 11.
Então, eu não tenho memória suficiente para armazenar resultado intermedite ao converter de binário para decimal. Como escrevi acima, eu não estou interessado em que o decimal, eu só quero imprimir o resultado. Mas, eu não vejo quaisquer outras maneiras de resolver isso ;-( Existe alguma solução para "apenas imprimir" de binário?
Ou, talvez, eu deveria usar algo como BCD (Binary Coded Decimal) para representação intermediária? Eu realmente não quero usar isso, porque não é tão multi-plataforma (processadores da Intel têm um recurso interno, mas por outro eu vou ter de escrever própria implementação).
Eu contente de ouvir seus pensamentos. Obrigado por paciência.
Idioma:. C
Solução
Maior tipo de dados integrante padrão é unsigned long long int
- no meu sistema (32 bits Linux em x86) que tem faixa de 0 - 1.8 * 10 ^ 20, que não é o suficiente para você, então você precisa para criar seu próprio tipo (struct ou array) e escrever matemática básica (basicamente você só precisa de um complemento) para esse tipo.
Se eu fosse você (ou a memória não é um problema), eu usaria um array - um byte por dígito decimal em vez de BCD. BCD é mais compacto que armazena 2 dígitos decimais por byte, mas você precisa colocar muito mais esforço trabalhando com altos e baixos petiscos separadamente.
E para imprimir basta adicionar '0'
(caráter, não dígitos) para cada byte de sua matriz e você terá uma seqüência de impressão.
Outras dicas
Eu recomendo usar tal como GMP (GNU multiprecision biblioteca) biblioteca. Você pode usar o tipo de dados mpz_t
para grandes números inteiros, os vários rotinas de importação / exportação para obter os seus dados em um mpz_t
e use mpz_out_str()
para imprimi-lo em base 10.
Bem, ao converter de binário para decimal, você realmente não precisa de todos os bits binários, ao mesmo tempo. Você só precisa os bits que você está calculando o poder do e provavelmente uma variável dupla para manter os resultados. Você poderia colocar o valor binário em uma matriz, digamos i [64], iterate através dela, obter o poder, dependendo da sua posição e continuar a acrescentar para o dobro.
Convertendo para decimal realmente significa cálculo de cada potência de dez, então por que não apenas armazená-los em um array de bytes? Em seguida, a impressão é apenas loop através da matriz.
Não foi possível alocar memória para, digamos, 5 int de, e armazenar o seu número no início da matriz? Em seguida, iterar manualmente sobre a matriz em pedaços de tamanho int-. Talvez algo como:
int* big = new int[5];
*big = <my big number>;