Реферат: Изучение методики перевода из одной системы исчисления в другую и разработка программы для этой операц
Реферат: Изучение методики перевода из одной системы исчисления в другую и разработка программы для этой операц
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, а при переводе в шестнадцатиричную систему мы
рассматриваем не просто степень числа шестнадцати, а
произведение этой степени на величину будущего разряда.
Возникает вопрос: а не одно ли это и тоже. Ведь умножив
число на единицу мы его не изменяем, а следовательно
нет разницы между тем, сравнивать степень с остатком
или с остатком умноженным на единицу. Таким образом вы-
яснилось, что перевод из десятеричной системы исчисле-
ния в двоичную и в шестнадцатиричную можно осуществлять
одной процедурой, в которую в качестве параметра пере-
давать основание степени, т.е. основание конечной
системы исчисления.
Чтобы не усложнять программу и не делать множество
операторов условного перехода в зависимости от того, к
какой системе исчисления принадлежит исходное число,
ввод этого числа осуществляется единым блоком, и исход-
ное число в результате выполнения этого блока записыва-
ется в виде строковой переменной и передается на обра-