Сколько цифр будет после преобразования из одной системы счисления в другую - PullRequest
2 голосов
/ 07 июня 2009

Основной вопрос: сколько цифр?

Позвольте мне объяснить. У меня есть число в двоичной системе: 11000000, а в десятичной - 192.

После преобразования в десятичное число, сколько у него будет цифр (в десятичном)? В моем примере это 3 цифры. Но это не проблема. Я искал через Интернет и нашел один алгоритм для составной части и один для дробной части. Я не совсем понимаю их, но (я думаю) они работают.

При преобразовании из двоичного кода в восьмеричное, это проще: каждые 3 бита дают вам восьмеричную цифру. То же самое для шестнадцатеричного числа: каждые 4 бита = 1 шестнадцатеричное число.

Но мне очень любопытно, что делать, если у меня есть число в системе счисления P и я хочу преобразовать его в систему счисления Q? Я знаю, как это сделать (я думаю, я знаю :)), но, во-первых, я хочу знать, сколько цифр в системе Q это займет (нет, я должен предварительно выделить место).

Ответы [ 7 ]

6 голосов
/ 07 июня 2009

Запись n в базе b занимает потолок (база журнала b (n)) цифр.

Отношение, которое вы заметили (восьмеричное / двоичное): log base 8 (n) / log base 2 (n) = 3 .

(из памяти будет торчать?)

5 голосов
/ 07 июня 2009

В моем предыдущем ответе была ошибка: посмотрите на комментарий Бена Швена. Извините за путаницу, я нашел и объяснил ошибку, которую я сделал в моем предыдущем ответе ниже.

Пожалуйста, используйте ответ, предоставленный Полом Томблином. (переписано для использования P, Q и n)

Y = ln(P^n) / ln(Q)
Y = n * ln(P) / ln(Q)

Таким образом, Y (округленный в большую сторону) - это количество символов, которое вам нужно в системе Q, чтобы выразить наибольшее число, которое вы можете закодировать в n символов в системе P.

У меня нет ответа (который не преобразовал бы число уже и занял бы столько места во временной переменной), чтобы получить минимальный минимум для данного числа 1000 (bin) = 8 (dec), в то время как вы зарезервировали бы 2 десятичные позиции по этой формуле.

Если временное использование памяти не является проблемой, вы можете обмануть и использовать (Python):

len(str(int(otherBaseStr,P)))

Это даст вам количество десятичных знаков, необходимое для преобразования числа в базе P, приведенного в виде строки (otherBaseStr), в десятичные числа.


Старый НЕПРАВИЛЬНЫЙ ответ:

Если у вас есть число в P, система счисления длины n Затем вы можете рассчитать максимально возможное число из n символов:

P^(n-1)

Чтобы выразить это наибольшее число в системе счисления Q, вам нужно использовать логарифмы (поскольку они обратны возведению в степень):

log((P^(n-1))/log(Q)
(n-1)*log(P) / log(Q)

Например 11000000 в двоичном коде - 8 символов. Чтобы получить его в десятичном виде, вам потребуется:

(8-1)*log(2) / log(10) = 2.1 digits (round up to 3)

Причина, по которой это было неправильно :

Максимально возможное число из n символов:

(P^n) - 1

не

P^(n-1)
5 голосов
/ 07 июня 2009

Если у вас есть число длиной X цифр в базе B, то максимальное значение, которое можно представить, равно B ^ X - 1. Так что, если вы хотите узнать, сколько цифр может занять в базе C, то у вас есть найти число Y, что C ^ Y - 1, по крайней мере, такой же большой, как B ^ X - 1. Способ сделать это - взять логарифм в базе C из B ^ X-1. А поскольку логарифм (log) числа в базе C такой же, как натуральный логарифм (ln) этого числа, деленный на натуральный логарифм C, он становится:

Y = ln((B^X)-1) / ln(C) + 1

и поскольку ln (B ^ X) равно X * ln (B), и это, вероятно, быстрее вычислить, чем ln (B ^ X-1) и достаточно близко к правильному ответу, перепишите это как

Y = X * ln(B) / ln(C) + 1

Переведите это на ваш любимый язык. Поскольку мы опустили «-1», в некоторых случаях мы можем получить на одну цифру больше, чем нужно. Но, что еще лучше, вы можете предварительно рассчитать ln (B) / ln (C) и просто умножить его на новые «X» и длину числа, которое вы пытаетесь преобразовать.

1 голос
/ 07 июня 2009

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

Обратите внимание, что наихудший случай для размера буфера происходит при преобразовании в двоичный файл, который дает размер буфера 32 символа для 32-разрядных целых чисел.

Преобразование числа в произвольное основание может быть выполнено с использованием функции C # ниже (код будет очень похож на другие языки, такие как C или Java):

public static string IntToString(int value, char[] baseChars)
{
    // 32 is the worst cast buffer size for base 2 and int.MaxValue
    int i = 32;
    char[] buffer = new char[i];
    int targetBase= baseChars.Length;

    do
    {
        buffer[--i] = baseChars[value % targetBase];
        value = value / targetBase;
    }
    while (value > 0);

    char[] result = new char[32 - i];
    Array.Copy(buffer, i, result, 0, 32 - i);

    return new string(result);
}
0 голосов
/ 08 июня 2009

Вы должны рассчитать длину дробной части отдельно.

Для двоичного числа в десятичное число содержит столько десятичных цифр, сколько битов. Например, двоичное значение 0.11001101001001 является десятичным числом 0,80133056640625, обе из 14 цифр после радикальной точки.

Для десятичного в двоичное, есть два случая. Если десятичная дробь равна dyadic , то число битов равно десятичному разряду (так же, как для двоичного числа в десятичное выше) Если дробь не двоичная, то число битов бесконечно.

(Вы можете использовать мой десятичный / двоичный преобразователь , чтобы поэкспериментировать с этим.)

0 голосов
/ 07 июня 2009

посмотрите на логарифмы базы P и базы Q. Округлите до ближайшего целого числа.

Логарифмическая база P может быть вычислена с использованием вашей любимой базы (10 или e): log_P (x) = log_10 (x) / log_10 (P)

0 голосов
/ 07 июня 2009

Ключевое слово здесь "логарифм", вот несколько наводящих ссылок:

http://www.adug.org.au/MathsCorner/MathsCornerLogs2.htm

http://staff.spd.dcu.ie/johnbcos/download/Fermat%20material/Fermat_Record_Number/HOW_MANY.html

...