0

下面的代码将大整数打印到十进制格式的文件中,如何将代码转换为打印二进制数据和十六进制数据到文件中?

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 ,我如何修改上面的代码以打印十六进制/二进制数据而不是十进制数据?

4

1 回答 1

1

要以 N 为底进行打印,您需要进行三处更改:

  1. 而不是在第二行中除以 10,而是除以 N
  2. 而不是在第三行做 mod 10,做 mod base 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 = ...线。
于 2010-01-07T07:21:49.237 回答