3 Преобразование чисел из одной системы счисления в другую

 

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

3.1 Перевод числа в десятичную систему счисления

Этот перевод легко осуществить простым вычислением полинома (4).

Алгоритм:

1. Записываем число в виде полинома

(8)

где S – основание системы счисления в десятичное системе счисления. Для двоичной, восьмеричной и шестнадцатеричной систем счисления это 2, 8 и 16 соответственно. Для шестнадцатеричной системы счисления вместо цифр A, B, C, D, E, F нужно подставлять их десятичные эквиваленты.

2. Вычисляем значение полинома, пользуясь десятичной арифметикой (которая нам, надо полагать, хорошо знакома).

Пример:

1D0.4H=1∙162+13∙161+0∙160+4∙16-1=256+208+0+0.25=464.25 (9)

Обратите внимание, что те, кто забыл со школы, чему равно 162, но занимаются сейчас, легко восполнят школьный пробел, заменив это число на 28.

 

 

3.2 Перевод числа из произвольной системы счисления в произвольную систему счисления

 

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

Мы же сконцентрируем свое внимание на универсальном способе перевода. Попробуем сформулировать задачу – что у нас есть, и чего мы хотим получить (дано – найти – ну все как в школе! А может быть, там все правильно учили?). Итак, то, что у нас есть число N в произвольной системе счисления с основанием S, означает, что мы имеем: во-первых, краткую форму записи этого числа, в которой нам заданы все цифры ai, во-вторых, мы знаем, что за краткой формой числа скрывается некий числовой эквивалент, вычисляемый по формуле (4). Это еще раз представлено формулой

(10)

Что нам нужно найти? Нам нужно найти, как этот число (числовой эквивалент не зависит от системы счисления и формы представления числа) будет представлено в новой системе счисления новыми цифрами ai` и новым основанием S`, т. е. найти представление (11):

(11)

А фактически, нам нужно найти совокупность ai` , поскольку S` нам задано. Или другими словами, нужно найти значения ai` , удовлетворяющие уравнению (11)- т.е. как-то решить это уравнение.

Давайте рассмотрим отдельно перевод целой части числа и дробной части числа.

3.2.1 Перевод целой части числа

Кто-то, несомненно, талантливый человек, предложил такой способ: поделить N/ S`. Давайте формально запишем результат деления (11) на S`:

(12)

Здесь возможны 2 случая: если N< S`, то получится частное, меньше 1, т.е. отличен от 0 только коэффициент а`0 – тогда результат достигнут и нужно просто оставить а`0 - это тривиальный случай и он не интересен. Если N> S`, то должно получиться целое частное N1I (индекс I от слова Integer - целый) (13) и остаток (14), который не делится нацело:

(13)
(14)

Остаток (14) получился, поскольку любая цифра всегда меньше основания системы счисления. Таким образом, нам удалось найти цифру младшего разряда в новой системе счисления.

Теперь если мы поделим N1 I на S` и снова выделим целое частное и остаток:

(15)
(16)

Таким образом, мы нашли следующую цифру числа в новой системе счисления.

Эту процедуру мы можем проделать какое-то число раз, пока не найдем все a` i. Очевидно, что для этого потребуется n-1 шаг. После этого, выписав все остатки так, что первый находится справа, а последний слева и, приписав к нему слева частное, меньшее S` (последнее частное) мы получим число N в системе счисления с основанием S`. Причем здесь потребуется конечное число шагов.

3.2.2 Перевод дробной части числа

Поскольку дробная часть (кстати, на английском, дробь - это Fraction) является некой противоположностью по отношению к целой части, то для перевода дробной части надо применить нечто противоположное. Относительно деления противоположным можно считать умножение. Действительно, давайте, применим операцию умножения на S` по отношению к дробной части. В результате получаем:

(17)

Анализируя полученное выражение, мы видим, что можно выделить целую часть a`-1 и дробную часть N1 F:

(18)

Целая часть a`-1 – это как раз то, что нам нужно – первая цифра дробной части!

Ну, а теперь, как часто говорят – легко сообразить – повторяя операцию умножения оставшейся дробной части на основание новой системы счисления мы будем получать следующие цифры дробной части числа в новой системе счисления. Однако, отметим, что, в отличие от перевода целой части числа, здесь не обязательно дело закончится конечным числом операций (хотя, кому-то может и повезти). Ведь существуют бесконечные дроби… И тут есть над чем подумать: будешь слишком много раз умножать – конкуренты обойдут, слишком мало – тоже, наверное, плохо! Свои мысли можно будет изложить в домашней работе и на экзамене.

 

3.2.3 Перевод смешанного числа

Тут, наверное, тоже легко сообразить, что нужно по отдельности перевести целую часть числа и дробную часть числа.

Ну, а теперь приведем полную формулировку правила перевода любого числа из одной произвольной системы счисления в другую произвольную систему счисления.

Для перевода целой части числа из одной позиционной системы с основанием системы счисления S в другую, с основанием S` (S` - основание новой системы) необходимо это число последовательно делить на S`, выписывая остатки до тех пор, пока не получится частное меньше S`. Число в новой системе запишется в виде остатков, первый остаток образует младший разряд, в старший разряд записывается последнее частное, меньшее основание новой системы. Деление выполняется в исходной системе, результат записывается цифрами новой системы.

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

Рассмотрим такой пример: переведем число 37.625 из десятичной системы в десятичную.

Начнем с целой части. В соответствии с выведенным правилом будем 37 последовательно делить на 2:

 

37 | 2

2 18 | 2

17 18 9 | 2

16 0 8 4 | 2

1 1 4 2 | 2

0 2 1

0

В результате деления осталась 1 (самая правая). Она не делится на 2, и она образует старший значащий разряд (забыл, как это по английски?). Если теперь начиная с этой единицы выбирать все остатки (они выделены жирным шрифтом и курсивом) справа налево и записывать их в двоичное число слева направо получим:

1001012

Теперь переведем дробную часть.

0|.625 * 2

1|.25 * 2

0|.5 * 2

1|.0

Здесь по случайному стечению обстоятельств дробная часть быстро закончилась. Если теперь выписать целые части (они тоже выделены жирным шрифтом и курсивом), то мы получим дробную часть:

0.1012

Таким образом, имеем

37.62510 = 100101.1012

Настоятельно рекомендуется при переводе чисел запись вычислений производить в представленной здесь форме.

Еще раз отметим, что приведенные правила верны для переводов из любой позиционной системы счисления в любую. В том числе и из двоичной в десятичную. Давайте переведем, пользуясь этими правилами, число 1001012 в десятичную систему счисления. Единственное что нам может помешать, так это то, что мы пока не умеем выполнять арифметические действия в двоичной системе счисления (как Вы помните, вычисления должны производиться в исходной системе счисления). Однако есть подозрение, что деление столбиком, которым мы лихо пользуемся в десятичной системе счисления, должно работать в любой системе счисления (ведь десятичная система формально не имеет никаких особенностей перед другими системами счисления!). Придерживаясь рекомендуемой формы записи, получим:

 

100101 | 1010

1010 11

10001

1010

111

Записывая полученные остатки 11 и 111 в десятичной системе счисления, получим число 37. Некоторым может показаться, что мы зря вводили правило для перевода в десятичную систему счисления. Да, зря если Вам кажется, что делить столбиком в произвольной системе счисления (например, в двоичной, девятеричной и т.д.) удобнее, чем вычислять полином в десятичной системе счисления.

Для проверки полученных навыков можно попытаться перевести некоторое число из пятеричной системы счисления в семеричную. Тут, кстати, возникает вопрос: а как проверить правильность перевода? Я рад, если у кого-то этот вопрос возник еще ранее. Надо над этим подумать…

 

3.3 Перевод чисел из двоичной системы счисления в восьмеричную и шестнадцатеричную системы счисления и обратно

 

Запишем произвольное число в двоичной системе счисления в соответствии с (5):

 

N= + b828+ b727+ b626+ b525+ b424+ b323+ b222+ b121+ b020.+ b-12-1+ b-22-2+ b-32-3+ b-42-4+ b-52-5+ b-62-6+

 

Давайте теперь в этом выражении несколько сгруппируем члены по три (в триады)

 

N= + ( b828+ b727+ b626)+( b525+ b424+ b323)+( b222+ b121+ b020).+( b-12-1+ b-22-2+ b-32-3)+( b-42-4+ b-52-5+ b-62-6)+…

 

Теперь из каждой скобки вынесем по общему множителю

N= + (b822+b721+b620)26+(b522+b421+b320)23+(b222+b121+b020)20.
+( b-122+ b-221+ b-32-0)2-3+( b-422+ b-521+ b-620)2-6+…=

= + ( b822+ b721+ b620)(23)2+( b522+ b421+ b320)(23)1+( b222+ b121+ b020)(23)0.
+( b-122+ b-221+ b-32-0)(23)-1+( b-422+ b-521+ b-620)(23)-2+…=

= ( b822+ b721+ b620)82+( b522+ b421+ b320)81+( b222+ b121+ b020)80.
+(b-122+b-221+b-32-0)8-1+(b-422+b-521+b-620)8-2+…=

= + O282+ O181+ O080.+ O-18-1+ O-28-2+… (19)

 

Рассмотрим, что же скрывает под символом Oi. Это выражения вида (bi22+bi21+bi20), где bi принимает значения 0 или 1. Отсюда следует, что Oi может принимать значения 0, 1, 2, 3, 4, 5, 6, 7. Пусть теперь в меня бросят камень, если последняя строка в (19) – это не запись числа в восьмеричной системе счисления. Если у кого-то рука все же потянулась к камню, пусть лучше направит свою энергию на более внимательное прочтение этих страничек, а именно, пусть посмотрит на формулу (6). Вот так-то!

Для тех, кто так ничего и не понял, просто сформулируем правило:

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

Совершенно очевидно, что применимы и обратные преобразования - предлагается сформулировать правило перевода чисел из восьмеричной системы счисления в двоичную самостоятельно.

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

Приятного Вам времяпровождения!

 

 

 

Зубрения этого текста с последующим пониманием должно хватить для успешного выполнения домашнего задания и контрольной работы по первому модулю РГР.