0

大変な作業というわけではありませんが、非 10 進数を別の非 10 進数に変換する唯一の方法は、最初に数値を 10 進数に変換し、次に 2 番目の手順で新しい基数に変換することです。たとえば、456 (基数 7) を 567 (基数 8) に変換するには、456 の 10 進値を計算し、その値を基数 8 に変換します...

7 から 8 に直接移動するより良い方法はありますか? またはそのことについては、他の基地への基地はありますか?

ここに私が持っているものがあります:


   //source_lang and target_lang are just the numeric symbols, they would be "0123456789" if they were decimal, and "0123456789abcdef" if hex.
   private string translate(string num, string source_lang, string target_lang)
    {
        int b10 = 0;
        string rv = "";
        for (int i=num.Length-1; i>=0; i--){
            b10 += source_lang.IndexOf( num[i] ) * ((int)Math.Pow(source_lang.Length, num.Length -1 - i));
        }
        while (b10 > 0) {
            rv = target_lang[b10 % target_lang.Length] + rv;
            b10 /= target_lang.Length;
        }
        return rv;
    }
4

1 に答える 1

8

本当に基数 10 に変換しているわけではありません。文字列表現ではなく、数値データ型に変換しています。どちらかといえば、バイナリに変換しています:)「整数」(本質的に基数を持たない)と「整数のテキスト表現」(基数を持つ)を区別する価値があります。

それは賢明な方法のように思えます、IMO。ただし、変換ルーチンは特に効率的ではありません。コードをParseFormatメソッドに分割すると、メソッドは次のConvertようになります。

public static string Convert(string text, int sourceBase, int targetBase)
{
    int number = Parse(text, sourceBase);
    return Format(number, targetBase);
}

stringもちろん、必要に応じて a を使用してさまざまなベースを表すことができます。ただし、そのような柔軟性が本当に必要な場合は、「数値表現」を表す新しいクラスを作成したくなるでしょう。そのクラスはおそらく持っているものParseFormatそしてそのConvert中に。)

于 2009-09-01T06:42:44.397 に答える