Pergunta

o código abaixo imprimir o BigInteger para um arquivo no formato decimal, como faço para converter o código para imprimir dados de dados e Hex binários para o arquivo em vez ??

static void
print_pos( FILE* f, bigint bi )
{
    if ( bi_compare( bi_copy( bi ), bi_10 ) >= 0 )
        print_pos( f, bi_int_divide( bi_copy( bi ), 10 ) );
    putc( bi_int_mod( bi, 10 ) + '0', f );
}

bi_10 é apenas um tipo de bigint, como faço para modificar o código acima para imprimir dados do Hex / binários em vez de dados decimais?

Foi útil?

Solução

Para imprimir em base de N, você precisa fazer três alterações:

  1. Em vez de dividir por 10 a na segunda linha, de divisão por N
  2. Em vez de fazer mod 10 na terceira linha, faça base de mod N
  3. Você vai precisar para converter o módulo da linha 2 para o personagem apropriado. Se você estiver fazendo base> 10, você vai precisar fazer um if / else

Aqui está o que seria semelhante usando inteiros simples. Eu vou deixar você fazer as alterações apropriadas para usar sua biblioteca int grande:

static void
print_pos( FILE* f, int n, int base )
{
    if (n < 0)
    {
        n *= -1;
        putc( '-', f );
    }

    if (n >= base)
        print_pos( f, n / base, base );

    int d = n % base;
    const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    putc( digits[d], f );
}

Um par de últimos comentários.

  1. O seu código original se esqueça de lidar com números negativos.
  2. Esta função funciona até base 36. Se você quiser bases ainda maior, você vai precisar para estender a linha char c = ....
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top