Смекни!
smekni.com

Изучение методики перевода из одной системы исчисления в другую и разработка программы для этой операц (стр. 1 из 3)

- 1 -

2О Г Л А В Л Е Н И Е

1. Введение

2. Постановка задачи

3. Теоретическая основа решения задачи

4. Методологический подход

5. Алгоритм программы для перевода из одной

системы исчисления в другую

6. Текст программы с комментариями

7. Подробные разъяснения по программе

8. Как пользоваться программой


- 2 -

2I. В В Е Д Е Н И Е

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

гую очень часто встречается при программировании. Осо-

бенно часто появляется такая проблема при программиро-

вании на Ассемблере. Например при определении адреса

ячейки памяти, для получения двоичного или шестнадцати-

ричного эквивалентов десятеричного числа. Иногда встает

проблема увеличения скорости вычислений, и тогда прихо-

дит на помощь двоичная система исчисления. В этой

системе исчисления очень быстро производить операцию

умножения путем сдвига одного из операндов в двоичном

виде влево на такое число позиций в которой стоит еди-

ница во втором операнде.

Рассмотрим подробнее как это осуществляется. Пусть

нам надо умножить число 1101 на 101 (оба числа в двоич-

ной системе исчисления). Машина делает это следующим

образом: она берет число 1101, и если первый элемент

второго множителя равен 1 то она заносит его в сумму.

Затем сдвигает число 1101 влево на одну позицию, полу-

чая тем самым 11010 и если второй элемент второго мно-

жителя равен единице то тоже заносит его в сумму. Если

элемент второго множителя равен нулю то сумма не изме-

няется. В связи с этим, если второй множитель содержит

много нулей, то операция умножения выполняется довольно


- 3 -

долго, т.к. машина проверяет каждую цифру второго мно-

жителя, в том числе и нули. Если же самому делать опе-

рацию умножения то нули можно пропустить и тогда умно-

жение сделается быстрее.

Что касается применения шестнадцатиричной системы

исчисления то здесь тоже большие возможности. Во-пер-

вых, некоторые стандартные процедуры Паскаля и Си тре-

буют задачи параметров в шестнадцатиричной системе, а

во-вторых, такая система исчисления очень удобна для

хранения информации, т.к. число в шестнадцатиричном ви-

де занимает меньше объема диска чем тоже число в деся-

теричном, а тем более в двоичном виде.

Таким образом мы убедились, что проблема перевода из

двоичной системы исчисления в десятеричную, из шестнад-

цатиричной в десятеричную и обратно очень актуальна.

2II. ПОСТАНОВКА ЗАДАЧИ

Из введения стало понятно, что наиболее часто встре-

чающиеся системы исчисления это двоичная, шестнадцати-

ричная и десятеричная. Иногда встречается и восьмирич-

ная система исчисления, но это бывает так редко, что не

стоит на этом останавливаться. Итак, наша задача осу-

ществить перевод из двоичной системы исчисления в деся-

теричную и шестнадцатиричную, из десятеричной в двоич-

ную и шестнадцатиричную и из шестнадцатиричной в двоич-

ную и десятеричную, т.е. взаимно связать все эти три

системы исчисления.


- 4 -

2III. ТЕОРЕТИЧЕСКАЯ ОСНОВА РЕШЕНИЯ ЗАДАЧИ

Как же на практике осуществляется перевод из одной

системы исчисления в другую? Попробуем разобраться.

Допустим нам нужно перевести число 567 десятеричной

системы в двоичную систему. Делается это следующим об-

разом: отыскивается максимальная степень двойки, чтобы

два в этой степени было меньше или равно исходному

числу. В нашем случае это 9, т.к. 2^9=512, а 2^10=1024

что больше нашего начального числа. Таким образом мы

получили число разрядов результата. Оно равно 9+1=10.

Значит результат будет иметь вид 1ххххххххх, где вместо

х может стоять 1 или 0. Найдем вторую цифру результата.

Возведем двойку в степень 9 и вычтем из исходного

числа: 567-2^9=55. Затем сравниваем с числом 2^8=256.

Так как 55 меньше 256 то девятый разряд будет нулем,

т.е. результат уже примет вид 10хххххххх. Рассмотрим

восьмой разряд: 2^7=128 > 55, значит и восьмой разряд

будет нулем. Т.к. 2^6=64 то седьмой разряд равен нулю.

Таким образом мы получили четыре старших разряда и

число примет вид 1000хххххх. Вычисляем 2^5=32 и видим,

что 32 < 55, значит шестой разряд равен 1 (результат

10001ххххх), остаток 55-32=23. 2^4=16 < 23 - пятый раз-

ряд 1 => 100011хххх. Остаток 23-16=7. 2^3=8 > 7 =>

1000110ххх. 2^2=4 < 7 => 10001101хх, остаток 3. 2^1=2 <

3 => 100011011х, остаток 1. 2^0=1 = 1 => 1000110111. Мы

получили конечный результат.


- 5 -

Теперь попробуем перевести тоже число 567, но уже в

шестнадцатиричную систему. Подход примерно такой же.

Определим максимальный разряд. Т.к. 16^2=256 < 567, а

16^3=4096 > 567, то максимальный разряд 2+1=3. Опреде-

лим число, которое будет стоять в третьем разряде.

Ищется максимальный множитель в пределах от 1 до 15,

чтобы текущая степень шестнадцати умноженная на этот

множитель была меньше или равнялась исходному числу (а

в дальнейшем - остатку). В нашем примере этот множитель

2, т.к. 256*2=512 < 567, а 256*3=768 > 567. Значит

старший разряд нашего результата будет равен 22 0, и ре-

зультат примет вид 2хх, где вместо х могут стоять любые

цифры или буквы из ниже перечисленных:

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Вычисляем остаток:

567-2*16^2=55. Определим что будет стоять во втором

разряде. Так как 3*16^1=48 < 55, а 4*16^1=64 > 55, то

во втором разряде будет стоять цифра 23 0. Оста-

ток=55-3*16^1=7. Определяем первый разряд: т.к. 16^0=1

то цифра первого разряда равна остатку, т.е. 27 0. Таким

образом мы получили число 2237 0, но уже в шестнадцатирич-

ной системе исчисления.

Операция перевода из десятеричной системы выглядит

гораздо проще. Рассмотрим ее на примере перевода из

шестнадцатиричной системы в десятеричную.

Допустим нам нужно перевести число 24A3F 0в десятерич-

ную систему. Берем старший (4 ый) разряд и возводим 16

в степень 4-1=3, получаем 16^3=4096. Полученный резуль-

тат умножаем на значение четвертого разряда, т.е. 4.


- 6 -

Получается 4096*4=16384. Этот результат мы заносим в

сумму. Переходим к следующему разряду: 16^2=256. 256

нужно умножить на значение третьего разряда т.е. A. Как

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

от A до F символизируют числа от 10 до 15 ( A=10, B=11,

C=12, D=13, E=14, F=15). Умножив 256 на 10 получим 2560

и этот результат добавляем к сумме, в которой у нас по-

ка было 16384. В сумму у нас получилось 18944. Перехо-

дим ко второму разряду: 3*16^1=48, добавив это в сумму

получим 18992. И последний разряд: 15*16^0=15. Конечная

сумма равна 219007 0. Мы получили результат в десятеричной

системе исчисления.

2IV. МЕТОДОЛОГИЧЕСКИЙ ПОДХОД

Рассматривая перевод из десятеричной системы

исчисления в двоичную и шестнадцатиричную, можно найти

много общего. В обоих случаях мы ищем максимальную сте-

пень, затем в обоих случаях сравниваем остаток с числом

возведенным в степень разряда. Единственная разница

заключается в том, что при переводе в двоичную систему

основанием степени служит двойка, а при переводе в

шестнадцатиричную систему основанием служит число шест-

надцать. Возникает вопрос: а нельзя ли объединить оба

этих перевода в одну процедуру, в которую в качестве

параметров передавать основание степени? При более под-

робном рассмотрении перевода в двоичную систему можно

заметить, что сравнивая остаток со степенью двойки мы


- 7 -

отмечаем только как бы два состояния: да или нет, т.е.

1 или 0, а при переводе в шестнадцатиричную систему мы

рассматриваем не просто степень числа шестнадцати, а

произведение этой степени на величину будущего разряда.

Возникает вопрос: а не одно ли это и тоже. Ведь умножив

число на единицу мы его не изменяем, а следовательно

нет разницы между тем, сравнивать степень с остатком

или с остатком умноженным на единицу. Таким образом вы-

яснилось, что перевод из десятеричной системы исчисле-

ния в двоичную и в шестнадцатиричную можно осуществлять

одной процедурой, в которую в качестве параметра пере-

давать основание степени, т.е. основание конечной

системы исчисления.

Чтобы не усложнять программу и не делать множество

операторов условного перехода в зависимости от того, к

какой системе исчисления принадлежит исходное число,

ввод этого числа осуществляется единым блоком, и исход-

ное число в результате выполнения этого блока записыва-

ется в виде строковой переменной и передается на обра-

ботку следующему блоку. Второй блок поступившую в него

строку символов обрабатывает таким образом, что на вы-

ходе этого блока получается числовое значение в десяте-

ричной системе исчисления исходного числа. И третий

заключительный блок преобразует это числовое значение в

строку символов, которая будет содержать результат в

системе исчисления, которая требовалась.

В результате такого подхода к решению задачи алго-

ритм значительно упрощается, т.к. в нем нет ветвлений.


- 10 -

2VII. ПОДРОБНЫЕ РАЗЪЯСНЕНИЯ ПО ПРОГРАММЕ

Программа начинается стандартной строкой:

Program Perevod;

Далее следует описательная часть программы. Она

состоит из нескольких разделов:

- Uses: указывает какие внешние TPU файлы будет

использовать программа (это специфика Turbo Pascal).

- Const: описывает используемые в программе констан-

ты. S - массив констант строк символов состоящих из пя-

тидесяти символов. Им присваиваются значения, которые

будут использоваться для составления меню.

- Var: описывает переменные.

Longint - целочисленный тип, значение которого может

изменяться от -2147483648 до 2147483647 и занимает в

памяти 32 бита.

Integer - целочисленный тип, может принимать значе-

ние от -32768 до 32767 и занимает объем памяти в 16

бит.

Char - символьный тип, может принимать значение лю-

бого символа.

Byte - целочисленный тип, может принимать значения

от 0 до 255 из занимает объем памяти в 8 бит.

Set of '0'..'F' - тип множество, элементы которого