0

以下のコードは、biginteger を 10 進形式でファイルに出力します。代わりに、バイナリ データと 16 進データを出力するようにコードを変換するにはどうすればよいですか??

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 の一種です。上記のコードを変更して、10 進数データではなく 16 進数/バイナリ データを出力するにはどうすればよいですか?

4

1 に答える 1

1

基数 N で印刷するには、次の 3 つの変更を行う必要があります。

  1. 2 行目の 10 で割る代わりに、N で割る
  2. 3 行目で 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 に答える