Электроника:Цифровая электроника/Системы счисления/Преобразование из десятеричной системы счисления

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Макаров В. (valemak) Контакты:</br>* Habr: @vakemak</br>* Сайт: www.valemak.com</br>Перевёл статей: 648.
Проверка/Оформление/Редактирование: Мякишев Е.А.


Преобразование из десятеричной системы счисления[1]

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

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

Однако преобразование десятеричного дробного числа в любую из этих «странных» систем счисления – это уже отдельный разговор.

Метод проб и приближений

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

Сначала покажем, как работает метод на примере целого (не дробного) числа.

Например, предположим, нужно представить десятеричное значение 87 в двоичной форме. Начнём с того, что изобразим пустые ячейки для цифр каждого разряда с указанием весовых коэффициентов:

Ячейки для двоичных цифр на позициях:
Вес разряда (указан в десятеричной системе счисления): 128 64 32 16 8 4 2 1

128 – это значение веса, превышающее величину искомого числа (87). Поэтому более высокие разряды (имеющие ещё больший вес) брать не имеет смысла.

Что ж, мы видим, что на месте разряда с весом 128, бит не может быть равен 1. Иначе получившееся десятеричное число будет от 128 и выше, что заведомо больше, чем 87. Однако, поскольку следующий разряд с весом 64 меньше 87, поэтому мы смело указываем в этом бите значение «1».

Ячейки для двоичных цифр на позициях: 1
Вес разряда (указан в десятеричной системе счисления): 64 32 16 8 4 2 1

Десятеричное значение нашего формируемого двоичного числа пока что равно 64. Это пока что меньше, чем 87, но не беда – сейчас ещё нарастим.

Переходим к следующему разряду с весом 32. Если в этой позиции указать бит равный «1», то общее значение было бы 6410 + 3210 = 9610. Это превышает 8710, из чего делаем вывод, что этот бит должен быть равен «0».

Если мы сделаем следующий (с разрядным весом 16) бит равным «1», это приведёт к общему значению 6410 + 1610 или 8010, т.е. мы приблизились к желаемому значению (8710), не превысив его:

Ячейки для двоичных цифр на позициях: 1 0 1
Вес разряда (указан в десятеричной системе счисления): 64 32 16 8 4 2 1

Десятеричное значение нашего формируемого двоичного числа на данный момент равно 80.

Продолжаем в том же духе, устанавливая каждый бит меньшего веса (указывая для него или «0» или «1»), поскольку нам нужно приблизиться к желаемому общему значению, не превышая его. И мы в конечном итоге придём к правильному значению:

Ячейки для двоичных цифр на позициях: 1 0 1 0 1 1 1
Вес разряда (указан в десятеричной системе счисления): 64 32 16 8 4 2 1

В итоге получаем 6410 + 1610 + 410 + 210 + 110 = 8710. Бинго!

Метод проб и приближений для восьмеричной и шестнадцатеричной систем счисления

Эта стратегия «пробников» также будет работать с восьмеричными и шестнадцатеричными преобразованиями. Возьмём то же десятеричное число 8710 и преобразуем его в восьмеричную систему счисления:

Ячейки для восьмеричных цифр на позициях:
Вес разряда (указан в десятеричной системе счисления): 64 8 1

Не забываем, что если для двоичной системы счисления мы для каждого бита выбирали или «0» или «1», то теперь для каждой позиции нужно подобрать цифру от 0 до 7. Если мы поставим цифру «1» на место разряда с весом 64, у нас будет общее значение 1 × 6410 = 6410 (что меньше, чем 8710). Если мы поставим цифру «2» на место разряда с весом 64, мы получим общее значение 2 × 6410 = 12810 (что уже больше, чем 8710). Проверять в этом разряде остальные восьмеричные цифры от 3 до 7 уже нет смысла, потому что мы будем получать ещё бо́льшие значения, превышающее желаемые 8710. Это свидетельствует о том, что наше восьмеричное число начинается с «1» в разряде с весом 64:

Ячейки для восьмеричных цифр на позициях: 1
Вес разряда (указан в десятеричной системе счисления): 64 8 1

Десятеричное значение нашего формируемого восьмеричного числа на данный момент равно 64.

Теперь экспериментируем со цифренным значением для разряда с весом 8, пытаясь получить общее (десятеричное) значение как можно ближе к 8710, но не превышая его. Пробуя несколько первых вариантов для восьмеричных цифр (1, 2, 3, …), получаем:

Для «1» имеем 6410 + 1 × 810 = 6410 + 810 = 7210.
Для «1» имеем 6410 + 2 × 810 = 6410 + 1610 = 8010.
Для «3» имеем 6410 + 3 × 810 = 6410 + 2410 = 8810.

Останавливаемся. При значении «3» для цифры на позиции с весом 8 происходит превышение над желаемыми 8710, так что в качестве этой цифры правильное значение – «2» (максимум, при котором превышения не происходит).

Ячейки для восьмеричных цифр на позициях: 1 2
Вес разряда (указан в десятеричной системе счисления): 64 8 1

Десятеричное значение нашего формируемого восьмеричного числа на данный момент равно 80.

Аналогично подбираем восьмеричную цифру для последнего разряда с весом, равным 1:

Ячейки для восьмеричных цифр на позициях: 1 2 7
Вес разряда (указан в десятеричной системе счисления): 64 8 1

Итоговый результат: 1 × 6410 + 2 × 810 + 7 × 110 = 6410 + 1610 +710 = 8710.

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

10101112 = 001 010 1112

Группы битов двоичного числа по три: 001 010 111
Эквиваленты в восьмеричной системе счисления: 1 2 7

Как видите, всё совпадает.

Можем ли мы таким же макаром выполнить преобразование десятеричных чисел в шестнадцатеричные? Конечно, хотя и вряд ли это у кого-либо вызовет приступ энтузиазма. Этот метод прост для понимания, но трудоёмок в выполнении.

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

Метод повторного (многократного) деления

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

В первом цикле деления мы берём исходное десятеричное число и делим его на основание системы счисления, в которую мы конвертируем (для двоичной = 2, для восьмеричной = 8, для шестнадцатеричной = 16).

Затем мы берём целочисленную часть результата деления (частное) и снова делим её на величину основания, и так продолжаем до тех пор, пока не получим частное меньше 1. Двоичные, восьмеричные или шестнадцатеричные цифры определяются «остатками», оставшимися после каждого шага деления. Давайте посмотрим, как это работает для перевода в двоичную форму, на примере десятеричного числа 8710:

Повторное деление Комментарий Остаток
87 / 2 = 43,5 Деля 87 на 2, получаем частное 43,5. Остаток при целочисленном делении = 1 (или можно найти остаток, если дробную часть умножить на основание: 0,5 × 2 = 1). 1
43 / 2 = 21,5 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([45,5] = 45) и делим его на 2. Получаем 21,5, т.е. снова остаток равен 1. 1
21 / 2 = 10,5 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([21,5] = 21) и делим его на 2. Получаем 10,5, т.е. снова остаток равен 1. 1
10 / 2 = 5 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([10,5] = 10) и делим его на 2. Получаем целое 5, т.е. остаток на этот раз равен 0. 0
5 / 2 = 2,5 Делим частное, полученное на предыдущем шаге, на 2. Получаем 2,5, т.е. остаток равен 1. 1
2 / 2 = 1 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([2,5] = 2) и делим его на 2. Получаем целое 1, т.е. остаток равен 0. 0
1 / 2 = 0,5 В последний раз производим деление на 2, потому что полученное частное меньше 1 и повторять деление снова (где 0 делится 2) смысла нет. Последний остаток равен 1. 1

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

Когда мы делим на 2, мы всегда будем получать частное, имеющее в дробной части либо «,0» либо «,5», то есть остаток будет равен 0 или 1. Как было сказано ранее, этот метод многократного деления для преобразования будет работать и для других систем счисления помимо двоичной.

Если бы мы выполняли последовательные деления с использованием другого основания, например 8 для преобразования в восьмеричное число, мы обязательно будем получать остатки в диапазоне от 0 до 7. Давайте попробуем произвести эти же действия с тем же десятичным числом, 8710 переведя его в восьмеричный формат:

Повторное деление Комментарий Остаток
87 / 8 = 10,875 Деля 87 на 8, получаем частное 10,875. Остаток при целочисленном делении = 7 (или можно найти остаток, если дробную часть умножить на основание: 0,875 × 8 = 7). 7
10 / 8 = 1,25 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([10,875] = 10) и делим его на 8. Получаем целое 1,25 т.е. остаток равен 2 (0,25 × 8 = 2). 2
1 / 8 = 0,125 Отбрасываем от частного, полученного на предыдущем шаге, дробную часть ([1,25] = 1) и делим его на 8. Получаем 0,125 т.е. остаток равен 1 (0,125 × 8 = 1). Так как результат меньше 1, процесс многократного деления не продолжаем. 1

Результат: 8710 = 1278.

Можно использовать аналогичную технику для преобразования чисел меньших 1 между системами счисления.

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

Для примера возьмём десятеричное число 0,812510 и преобразуем его в двоичное:

Повторное умножение Комментарий Целая часть
0,8125 × 2 = 1,625 Умножаем первоначальное число на основание. Целая часть равна 1, дробная часть не равна нулю (поэтому будем повторять процесс). 1
0,625 × 2 = 1,25 От произведения, полученного на предыдущем шаге, отбрасываем целую часть (1,625 → 0,625) и оставшуюся дробную часть умножаем на основание. В получившемся результате целая часть равна 1, дробная часть не равна нулю (поэтому процесс ещё не закончен). 1
0,25 × 2 = 0,5 От произведения, полученного на предыдущем шаге, отбрасываем целую часть (1,25 → 0,25) и оставшуюся дробную часть умножаем на основание. В получившемся результате целая часть равна 0, дробная часть не равна нулю (поэтому процесс ещё не закончен). 0
0,5 × 2 = 1,0 От произведения, полученного на предыдущем шаге, берём дробную часть (0,25) и умножаем на основание. В получившемся результате целая часть равна 1, дробная часть равна нулю (поэтому процесс завершён). 1

Результат: 0,812510 = 0,11012.

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

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

При целочисленном (делении) мы работали от младшего разряда к старшему (справа-налево), но при повторном умножении мы работаем слева-направо.

А если нужно преобразовать число, большее единицы, у которого есть дробная часть? Всё просто – нужно отдельно обработать целую часть (применив к ней метод повторного деления) и дробную часть (применив к ней метод повторного умножения).

Возьмем, к примеру, десятеричное число 54,4062510 и приведём его к двоичному виду.

Сначала разберёмся с целой частью числа (5410):

Повторное деление Целая часть Остаток
54 / 2 = 27,0 27 0
27 / 2 = 13,5 13 1
13 / 2 = 6,5 6 1
6 / 2 = 3 3 0
3 / 2 = 1,5 1 1
1 / 2 = 0,5 0 1

Берём остатки снизу-вверх и получаем двоичную форму целой части искомого числа: 5410 = 1101102. Теперь обработаем дробную часть (0,4062510):

Повторное умножение Дробная часть Целая часть
0,40625 × 2 = 0,8125 0,8125 0
0,8125 × 2 = 1,625 0,625 1
0,625 × 2 = 1,25 0,25 1
0,25 × 2 = 0,5 0,5 0
0,5 × 2 = 1,0 0,0 1

Берём целые части сверху-вниз и получаем двоичную форму дробной части искомого числа: 0,4062510 = 0,011012.

Остаётся только объединить целую и дробную части:

5410 + 0,4062510 = 54,4062510 1101102 + 0,011012 = 110110,011012.

Есть, правда, ещё один замечательный нюанс, о котором лучше знать – даже если дробная часть десятеричного числа точно определена (то есть, число не иррациональное и это не периодичная дробь), то при переводе в двоичную систему счисления дробная часть может запросто оказаться с бесконечным периодом! То есть, точно известное дробное десятеричное число можно лишь приблизительно представить в двоичном виде!

Например:

0,810 = 0,1100110011001100110011001100…2 = 0,(1100)2

Но в эти дебри мы сейчас уже углубляться не будем.

См.также

Внешние ссылки