Преобразование недесятичных чисел в другое не десятичное - PullRequest
0 голосов
/ 01 сентября 2009

Не то чтобы это было много работы, но я знаю, что единственный способ преобразовать недесятичное в другое недесятичное - это сначала преобразовать число в десятичное, а затем сделать второй шаг, чтобы преобразовать его в новую базу. Например, чтобы преобразовать 456 (в базе 7) в 567 (в базе 8), я бы вычислил десятичное значение 456, а затем преобразовал бы это значение в базу 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;
    }

1 Ответ

8 голосов
/ 01 сентября 2009

В действительности вы не конвертируете в базу 10. Вы конвертируете ее в числовой тип данных вместо строкового представления. Во всяком случае, вы конвертируете его в двоичный код :) Стоит проводить различие между «целым числом» (которое по сути не имеет основы) и «текстовым представлением целого числа» (которое имеет).

Кажется, это разумный путь, ИМО. Тем не менее, ваши процедуры преобразования, безусловно, не особенно эффективны. Я бы разделил ваш код на методы Parse и Format, тогда метод Convert может выглядеть примерно так:

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

(Вы можете использовать string для представления различных баз, если хотите, конечно. Если вам действительно нужна такая гибкость, я бы хотел создать новый класс для представления "числового представления" Вероятно, в этом классе должны быть Parse, Format и Convert.)

...