Печать двоичного (байтового) значения в файле - PullRequest
0 голосов
/ 07 января 2010

в приведенном ниже коде распечатать biginteger в файл в десятичном формате. Как преобразовать код в печать двоичных данных и шестнадцатеричных данных в файл вместо этого?

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 - это просто тип bigint, как мне изменить вышеприведенный код для печати шестнадцатеричных / двоичных данных вместо десятичных?

1 Ответ

1 голос
/ 07 января 2010

Для печати в базе N вам необходимо внести три изменения:

  1. Вместо деления на 10 во второй строке, делим на N
  2. Вместо того, чтобы делать мод 10 в третьей строке, делайте базу модов N
  3. Вам нужно будет преобразовать модуль из строки 2 в соответствующий символ. Если вы делаете base> 10, вам нужно будет выполнить if / else

Вот как это выглядит при использовании простых целых чисел. Я позволю вам внести соответствующие изменения, чтобы использовать вашу большую библиотеку int:

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 );
}

Несколько последних комментариев.

  1. Ваш исходный код забудьте об отрицательных числах.
  2. Эта функция работает до базы 36. Если вам нужны еще большие базы, вам нужно расширить строку char c = ....
...