Информатика (конспект лекций)
.pdfПереведем в семеричную систему число 20110.
Выполним необходимую последовательность операций деления числа 201 на ос- нование семеричной системы B = 7:
201:7 = 28, 28:7 = 4, 4:7 = 0,
востатке 5,
востатке 0,
востатке 4.
Таким образом, 20110 = 4057.
Переведем в шестнадцатеричную систему число 690010.
Выполним необходимую последовательность операций деления числа 6900 на основание шестнадцатеричной системы B=16:
6900:16 = 431, 431:16 = 26, 26:16 = 1, 1:16 = 0,
Получается 690010 = 1AF416.
востатке 4,
востатке 15 (это значение цифры F),
востатке 10 (это значение цифры A),
востатке 1.
Перевод дробной части числа
Дробная часть числа в системе с основанием B есть позиционная дробь
0,a-1a-2…a-k,
записанная цифрами этой системы счисления и обозначающая сумму
a-1 B-1 + a-2 B-2 + … + a-k B-k, |
(7) |
которая, очевидно, лежит в промежутке от 0 до 1.
Нетрудно догадаться, что значение цифры a-1 можно извлечь путем умножения величины (7) на основание B. Результат умножения составляет величину a-1 + a-2 B-1 + … +a-k B-k+1 , и его целая часть представляет собой искомое значение цифры a-1. Вычитая целую часть, вновь получим величину между нулем и единицей, из которой таким же путем можно будет извлекать следующие цифры. Процесс про- должается до тех пор, пока не будет получена нулевая дробная часть или пока не бу- дет достигнута приемлемая точность представления дроби.
Заметим, что в этом процессе искомые цифры открываются нами в прямом по- рядке, т. е. в порядке записи их в числе, слева направо.
Примеры. Переведем в двоичную систему дробь 0,37510.
Выполним для этого следующую последовательность операций умножения дро- би 0,37510 на основание двоичной системы B = 2:
0,375×2 = 0,75; целая часть равна 0, 0,75×2 = 1,5; целая часть равна 1 (вычитаем целую часть из результата),
0,5×2 = 1,0; целая часть равна 1 (вычитаем ее из результата, остается 0).
Т.к. достигнута нулевая дробная часть, то перевод заканчивается получением точного двоичного представления дроби: 0,37510 = 0,0112.
11
Переведем в двоичную систему дробь 0,110.
По аналогии с предыдущим примером получаем двоичные цифры дроби с помо- щью следующей цепочки операций:
0,1×2 = 0,2; целая часть равна 0, 0,2×2 = 0,4; целая часть равна 0, 0,4×2 = 0,8; целая часть равна 0,
0,8×2 = 1,6; целая часть равна 1 (вычитаем ее из результата, остается 0,6), 0,6×2 = 1,2; целая часть равна 1 (вычитаем ее из результата, остается 0,2), 0,2×2 = 0,4; целая часть равна 0,
. . . . . . . . . .
Очевидно, что поскольку последняя строка цепочки совпадает со второй, то да- лее все будет повторяться периодически. Таким образом,
0,110 = 0,0(0011)2 ≈ 0,00011001100110011001100112.
Период двоичной дроби выделен здесь круглыми скобками. Зная формулу для вычисления суммы геометрической прогрессии, нетрудно проверить, что бесконеч- ная двоичная дробь 0,0(0011)2 в точности равна 0,110. Предлагаем в качестве уп- ражнения сделать такую проверку самостоятельно.
1.3.3 Несколько замечаний о технике перевода чисел
Почему способ перевода чисел зависит от направления перевода
С чисто математической точки зрения все системы счисления равноправны. Но почему тогда различаются способы перевода чисел из десятичной системы счисле- ния в другие системы, с одной стороны, и способы перевода чисел из других систем
в десятичную систему счисления – с другой?
Причина состоит в том, что мы обучены выполнять арифметические операции в десятичной системе счисления. И правила перевода чисел сформулированы так, чтобы нам не выходить за пределы нашей десятичной системы более чем на полша- га, необходимого для замены цифр одной системы счисления цифрами другой сис- темы.
Когда число переводится из другой системы счисления в десятичную, то его не- десятичные цифры мы сразу заменяем их десятичными значениями; все последую- щие вычисления проводятся в десятичной системе.
Когда мы переводим десятичное число в другую систему счисления, то необхо- димые для его записи в другой системе цифры (недесятичные) нам неизвестны. По- этому сначала мы их все находим, проводя вычисления в десятичной системе, и только потом составляем из них запись числа.
Таким образом, рассмотренные выше правила перевода чисел ориентированы на выполнение операций в десятичной системе счисления.
Если бы мы предпочитали делать вычисления в другой системе счисления, на- пример, в двоичной, то правила перевода были бы ориентированы на нее. Тогда для перевода числа 12510 в двоичную форму мы сразу заменили бы все «неудобные» де- сятичные цифры 1, 2 и 5 их двоичными значениями 1, 10 и 101 соответственно. По-
12
скольку основание B=1010 «неудобной» десятичной системы счисления запишется при этом как двоичное число B=10102, то наш расчет будет выглядеть так:
12510=1× (1010)2 + 10× (1010)+101 = 1100100+10100+101 =11111012.
Заметим, что проиллюстрированный здесь двоично-ориентированный перевод чисел имеет не только чисто теоретическое значение. На практике именно его при- ходится реализовывать специалистам, которые программируют преобразование де- сятичных чисел, вводимых в ЭВМ, в двоичную, внутреннюю для ЭВМ форму пред- ставления. Ведь ЭВМ выполняет операции над двоичными числами, поэтому ее правила перевода ориентированы на двоичную систему счисления. А когда числа переводятся в десятичную форму для вывода из ЭВМ, то сначала по правилам дво- ичной арифметики происходит расчет значений десятичных цифр (отдельно для це- лой и для дробной части двоичного числа – если она есть), а затем в процессе печати выводятся символы найденных десятичных цифр.
Перевод чисел из системы счисления с основанием B1 ¹ 10 в систему с основанием B2 ¹ 10
Сначала можно перевести число из одной – любой – системы счисления в деся- тичную систему, потом из десятичной системы – в любую другую.
Переведем, например, семеричное число 257 в троичную систему.
Сначала переводим число из семеричной системы в десятичную:
257 = 2×7 +5 = 1910.
Затем из десятичной – в троичную: 19:3 = 6 (1), 6:3 =2(0), 2:3 = 0(2). В скобках записаны остатки от деления. В итоге получаем 257 = 2013.
Здесь все арифметические действия проводятся в десятичной системе счисления, и она используется в качестве «промежуточной станции» для перехода из одной не- десятичной системы в другую.
Таблица первых шестнадцати двоичных чисел
Обычно студенты, изучающие информатику, довольно легко запоминают первые несколько двоичных чисел в силу их частой встречаемости во многих учебных дис- циплинах. В таблице 1 приводятся первые шестнадцать двоичных чисел. Они при- водятся здесь также в системе счисления с основанием 16. Наряду с этими конкрет-
ными данными при изучении информатики полезно знать наизусть первые несколь- ко степеней числа 2 (хотя бы от 20 = 1 до 210 = 1024).
Степени числа B в системе с основанием B записываются в виде круглых чисел: B0 = 1B, B1 = 10B, B2 = 100B, B3 = 1000B , ... , т. е. n–я степень основания системы счисления представляется в ней числом, составленным из единицы и n нулей. Это легко видеть из ключевого полинома (5). Отрицательная степень B-n записывается в виде позиционной дроби, содержащей единицу в n-м разряде после запятой (и нули в других разрядах).
13
Таблица 1 – Первые 16 чисел в системах с основаниями B = 2, B = 8 и B = 16
Десятичное |
Двоичное число |
Восьмеричное число |
Шестнадцатеричное |
число |
(B = 2) |
(B = 8) |
число (B = 16) |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
1 0 |
2 |
2 |
3 |
1 1 |
3 |
3 |
4 |
1 0 0 |
4 |
4 |
5 |
1 0 1 |
5 |
5 |
6 |
1 1 0 |
6 |
6 |
7 |
1 1 1 |
7 |
7 |
8 |
1 0 0 0 |
1 0 |
8 |
9 |
1 0 0 1 |
1 1 |
9 |
10 |
1 0 1 0 |
1 2 |
A |
11 |
1 0 1 1 |
1 3 |
B |
12 |
1 1 0 0 |
1 4 |
C |
13 |
1 1 0 1 |
1 5 |
D |
14 |
1 1 1 0 |
1 6 |
E |
15 |
1 1 1 1 |
1 7 |
F |
Перевод чисел в случае оснований, равных степени числа два
Основания восьмеричной и шестнадцатеричной систем счисления выражаются целой степенью двух (8 = 23, 16 = 24). Этим объясняется простота перевода чисел из данных систем в двоичную систему счисления.
Для перевода чисел из восьмеричной системы счисления в двоичную достаточно каждую цифру восьмеричного числа заменить соответствующим трехразрядным двоичным числом, например,
735,248 ® 111 011 101, 010 1002.
Удостоверимся в правильности такого перевода, применяя ключевой полином:
735,248 = (7×82 + 3×81 + 5×80 + 2× 8-1 + 4×8-2 )10 = = (111×10002 + 011×10001 + 101×10000 + 010×1000-1 + 100×1000-2 )2 =
=(111 000 000 + 011 000 + 101 + 0, 010 + 0, 000100)2 = 111 011 101, 010 1002.
Получили тот же результат. Напомним, что показатели степени и индексы мы пред- ставляем везде в десятичной системе счисления.
Перевод в двоичную систему счисления шестнадцатеричных чисел достигается заменой цифр исходного шестнадцатеричного представления четырехразрядными двоичными числами, например:
А3В,С916 ® 1010 0011 1011, 1100 10012
(см. табл. 1).
14
При обратном переводе чисел из двоичной системы в восьмеричную или шест- надцатеричную систему счисления необходимо разряды двоичного числа, отсчиты- вая их от запятой влево и вправо, разбить на группы по три разряда (в случае пере- вода в восьмеричную систему) или на группы по четыре разряда (в случае перевода в шестнадцатеричную систему счисления). Неполные крайние группы дополняются до полных групп нулями. Затем каждая двоичная группа представляется цифрой той системы счисления, в которую переводится число, например:
001 111,101 0102 → 17,528; 0101 1100,1011 01102 → 5С,В616 .
Отсюда вытекает и простое общее правило перевода чисел из системы с основа- нием B1 = 2n в систему с основанием B2 = 2m. Для перевода чисел между такими системами удобно в качестве «промежуточной станции» использовать двоичную систему счисления. Пусть, например, требуется перевести число 232130,14 в шест- надцатеричную систему счисления. Для этого сначала переведем число в двоичную систему, заменяя в нем цифры двухразрядными двоичными числами:
232130,14 = 10 11 10 01 11 00, 012 .
Затем, перегруппировав цифры в полученной двоичной записи числа по четыре, переведем его из двоичной системы в шестнадцатеричную:
10 11 10 01 11 00, 012 = 1011 1001 1100, 01002 = B9C,416.
Получается, что 232130,14 = B9C,416.
Очевидно, такой перевод для рассмотренного класса систем счисления выполня- ется намного проще, чем перевод через десятичную систему. Упрощение перевода чисел здесь заключается в том, что он производится без выполнения арифметиче- ских операций, прямой заменой цифр.
Шестнадцатеричная система часто используется и просто в качестве стандарта для компактной записи длинных двоичных чисел. Так, например, любое 16-разрядное двоичное число («слово») изображается всего лишь четырьмя симво- лами от 0 до F, а восьмиразрядное («байт») – только двумя.
1.4 Признаки делимости
Достаточно взглянуть на запись нескольких чисел в недесятичной системе, что- бы обнаружить, что признаки делимости в разных системах счисления должны быть разными. Например, в троичной системе число три записывается как 10, а четыре – как 11; так что к ним известные нам из десятичной системы признаки делимости на три и на два оказываются неприменимы.
Признаки делимости для недесятичной записи чисел можно находить, опираясь на аналогию с признаками делимости десятичных чисел. Проверять или доказывать
справедливость получаемых таким образом признаков мы можем на основании все того же ключевого полинома (5). Естественно, цифры дробной части в полиноме будут отсутствовать.
Сформулируем несколько таких признаков для двоичной системы.
15
Цифровая запись двоичного числа am am-1…a1 a0, составленная из цифр 0 и 1,
обозначает величину
n = am2m + am-12m-1 + …+ a222 + a12 + a0. |
(8) |
Здесь все слагаемые, кроме последнего, делятся на 2 при любых значениях цифр. Последнее слагаемое – цифра a0 – делится на 2 только при a0 = 0. Отсюда следует, что целое двоичное число делится на 2 без остатка тогда и только тогда, когда оно заканчивается цифрой 0. Подобным образом устанавливается и более общий при-
знак делимости двоичного числа на 2p: двоичное число делится на 2p тогда и толь- ко тогда, когда оно заканчивается p нулями. Здесь мы видим явную аналогию меж-
ду ролью числа 2 в двоичной системе и числа 10 – в десятичной.
В связи с простотой перехода от двоичного представления числа к его более компактным (четверичному, восьмеричному и т. п.) представлениям, признаки де-
лимости двоичных чисел можно формулировать посредством таких компактных представлений.
Например, для определения признака делимости двоичного числа на 3 попробу- ем опереться на аналогию между ролью числа 3 в четверичной системе счисления – где оно является старшей цифрой – и числа 9 в десятичной системе. Может быть, и признак делимости на три в четверичной системе будет столь же простым, как при- знак делимости на девять в десятичной системе? Сформулируем такую гипотезу:
четверичное число делится на 3 тогда и только тогда, когда сумма его цифр де-
лится на 3. Проверяя это правило для чисел 34, 124, 214, 304 , … , (десятичные 3, 6, 9, 12, …), обнаруживаем подтверждения нашей гипотезы. Доказательство этого най- денного с помощью метода аналогий правила делимости не сложно, но лежит не- сколько в стороне от нашей основной тематики, поэтому здесь не приводится. Для желающих найти доказательство самостоятельно даем подсказку: нужно предста- вить четверичное число в виде ключевого полинома и использовать тот факт, что 4m –1 делится на три.
Итак, двоичное число делится на 3 тогда и только тогда, когда сумма цифр его четверичной записи делится на три. Например, 1 11 00 10 10 01 102 = 1302124 делит- ся на 3.
Используя метод аналогий, можно сформулировать, а затем и доказать, признак делимости двоичного числа на 7 (сумма цифр его восьмеричного представления должна делиться на три) и на 15 (сумма цифр шестнадцатеричного представления числа должна делиться на 15). Заметим, что признак делимости на 7 для двоичного числа получается более простым, чем для числа десятичного.
Признак делимости двоичного числа на 5 можно определить через четверичное представление – тогда он будет аналогичен признаку делимости десятичного числа на одиннадцать. Двоичное число делится на 5 тогда и только тогда, когда сумма цифр, стоящих в его четверичном представлении на четных местах, отличается от суммы цифр, стоящих на нечетных местах, на число, кратное пяти.
Предлагаем по аналогии с признаком делимости на 5 сформулировать признак делимости двоичного числа на 9 (через его восьмеричное представление).
16
2 ДВОИЧНАЯ АРИФМЕТИКА
Арифметика или числительница есть худо- жество честное, независтное, и всем удобопо- нятное, многополезнейшее, от древнейших же и новейших, в разные времена живших изрядней- ших арифметиков изобретенное и изложенное.
Леонтий Филиппович Магницкий
2.1 Алгоритмы арифметических действий
Четыре основные арифметические операции – сложение, умножение, вычитание и деление чисел – в любой системе счисления выполняются с помощью алгоритмов, в которых операции над числами сводятся к операциям над цифрами (разрядами) этих чисел.
Алгоритмы выполнения арифметических операций в десятичной системе счис- ления стали известны в Европе после перевода на латинский язык в XII веке осно- вополагающих трактатов по арифметике и алгебре, которые написал среднеазиат- ский ученый Аль-Хорезми Мухаммед бен Муса (787 – ок. 850). Происхождение сло- ва «алгоритм», или «алгорифм», восходит к латинской транслитерации «algorismus» от имени этого ученого. А слово «алгебра» берет начало от названия его «Книги о восстановлении и противопоставлении» – «Китаб аль-джебр валь-мукабала».
Известные алгоритмы выполнения арифметических действий с десятичными числами легко трансформируются в алгоритмы действий с двоичными числами. Единственное изменение алгоритмов сводится при этом к тому, что не десять, а две единицы данного разряда составляют единицу следующего по старшинству разряда.
Отсюда однозначно определяются правила переноса из младших разрядов в старшие при сложении чисел и правила заема из старших разрядов в младшие – при вычита- нии.
Рассмотрим основные правила двоичной арифметики подробнее.
2.1.1 Сложение
Поскольку цифрами двоичных чисел могут быть только 0 и 1, таблица сложения цифр содержит всего четыре строки:
0 + 0 = 0,
0 + 1 = 1,
1 + 0 = 1,
1 + 1 = 10.
В последнем случае, когда в обоих суммируемых разрядах находятся единицы, в со- ответствующий разряд суммы записывается 0 и в следующий, старший разряд пере- носится единица. Эта единица в старшем разряде заключает в себе весь результат сложения – двоичное число 10, – полученный в данном разряде.
Заметим, что если в данном разряде в обоих суммируемых числах находятся единицы и еще поступает единица переноса из предыдущего разряда, то результа-
17
том суммирования будут три единицы, т. е. двоичное 11. Естественно, такой резуль- тат составляет единицу и единицу переноса. В следующем примере эта ситуация возникает на шаге сложения цифр третьего (справа) разряда:
10110 + 11110
110100.
Рекомендуем проделать это сложение «в столбик» два-три раза подряд, никак не интерпретируя значений двоичных чисел, а только используя таблицу сложения (на память, механически). Напомним, что двоичные результаты 10 и 11 можно при этом называть «десять» и «одиннадцать». После таких просчетов становится очевидным, насколько простой операцией является сложение чисел в двоичной системе.
2.1.2 Умножение
Таблица умножения в двоичной системе еще проще:
0 × 0 = 0,
0 × 1 = 0,
1 × 0 = 0,
1 × 1 = 1.
При умножении разрядов переносов не возникает. Однако все умножение «в столбик» двух чисел приводит к сложению нескольких сдвинутых друг относитель- но друга двоичных чисел. В ЭВМ они прибавляются в сумматор по одному, поэтому там больше двух чисел сразу в сложении не участвуют. Но нам, при решении при- меров на бумаге, для экономии места и времени приходится суммировать разряды сразу нескольких двоичных чисел. Это как раз один из тех случаев, когда помогает хорошее знакомство с первыми двоичными числами (см. таблицу 1).
Выполним, например, такое умножение:
10111
×11011
10111
10111
10111
10111 .
1001101101.
Здесь при суммировании всей лесенки сдвинутых частичных произведений 10111, как только доходим до самого высокого столбика разрядов, мы должны сло- жить в нем четыре единицы (с учетом единицы переноса). А так как четыре есть двоичное 100, то в данном разряде в сумме остается 0, а в следующий разряд пере- носится 10, т. е. две единицы. В этом следующем разряде вместе с тремя единицами слагаемых две единицы переноса дают пять единиц, из которых одна остается, а че- тыре вновь переносятся в следующий разряд как два (двоичное 10) и т. д.
Как видно из примера, умножение в двоичной системе счисления сводится к операциям сдвига множимого и сложения.
18
2.1.3 Вычитание
Будем считать, что вычитаемое меньше уменьшаемого (если требуется вычесть из меньшего числа большее, то, как обычно, вычитается сначала из большего числа меньшее, а затем к полученному результату приписывается знак минус).
С учетом правила заема получается такая таблица двоичного вычитания:
0 - 0 = 0,
0 - 1 = 1,
1 - 0 = 1,
1 - 1 = 1.
Правило 0 - 1 = 1 применяется в текущем разряде вместе с правилом заема еди- ницы в старшем, соседнем разряде уменьшаемого, которая в данном разряде воз-
вращается уже двумя единицами (двоичное 10). Вычитание из них 1 дает 1.
В следующем примере вычитания можно увидеть, как занятая в отдаленном
старшем разряде единица последовательно распределяется по младшим разрядам уменьшаемого:
10000 - 10
1110.
Здесь, чтобы вычесть 1 из 0 во втором справа разряде, мы заняли сначала еди- ницу в самом старшем – пятом – разряде; она превратилась в две единицы четверто- го разряда; из них одну мы оставили, а другую перенесли в третий разряд, в котором она превратилась в две единицы; из них одну мы оставили, другую перенесли во второй разряд, в котором она превратилась в две единицы, и из этих двух единиц второго разряда мы уже произвели вычитание.
В целом в процессе такого заема единица старшего разряда превратилась в еди- ницы во всех следующих вправо разрядах, вплоть до разряда назначения, где мы из двух доставленных сюда единиц выполнили вычитание.
2.1.4 Деление
Деление в двоичной системе счисления также выполняется в полной аналогии с десятичной арифметикой. Рассмотрим пример:
1011011 ë 111
-111 1101. 1000 -111
111 -111 0
Выполняя показанные здесь вычисления можно заметить, что в двоичной систе- ме подбор очередной цифры частного отличается предельной простотой: если оче- редное промежуточное делимое больше делителя, то к частному приписывается 1. В противном случае к частному приписывается 0 (а к промежуточному делимому – следующая цифра делимого).
19
2.2 Машинные коды целых чисел
Принципиальным ограничением при реализации арифметических операций ап- паратными средствами ЭВМ является конечное число разрядов, предусматриваемых для записи чисел. Для хранения и обработки процессором ЭВМ двоичных чисел применяются электронные устройства, называемые регистрами. Двоичные цифры (разряды) числа хранятся в отдельных триггерах, входящих в состав регистра.
Совокупность разрядов, в которой записывается двоичное число, называют раз- рядной сеткой, а количество этих разрядов – длиной разрядной сетки, которую бу-
дем обозначать буквой b. Типичная длина разрядной сетки, которая поддерживается процессорами современных компьютеров, составляет 4 (тетрада), 8 (байт), 16 (слово), 32 (двойное слово) и 64 (четверное слово) двоичных разряда.
Из того, что длина разрядной сетки числа ограничена, сразу следует конечность множества чисел, которые можно в ней записать. Проблема ограниченности множе- ства представимых чисел рационально решается путем использования двух специ- альных форматов записи чисел, называемых форматом с фиксированной запятой (или с фиксированной точкой) и форматом с плавающей запятой (или с плавающей точкой). Эти форматы (см. п. 2.2.5 и 2.2.6) позволяют практически без увеличения
длины разрядной сетки обеспечить достаточно высокую точность арифметических операций в очень широком диапазоне чисел.
Кроме того, специальные методы кодирования чисел позволяют достичь сущест-
венного упрощения структуры арифметического устройства ЭВМ путем сведения всех четырех арифметических операций к операции суммирования. Точнее, специ- альные коды сводят к суммированию только операцию вычитания чисел, поскольку двоичное умножение, как мы видели, само по себе сводится к сложению, а деление
– к вычитанию (см. п. 2.1.2 и 2.1.4).
Специальные коды для записи отрицательных чисел позволяют свести операцию вычитания чисел к арифметическому сложению кодов этих чисел. Наиболее широко здесь применяют обратный, дополнительный и модифицированный коды, которые рассматриваются ниже, вслед за естественным прямым кодом двоичных чисел.
2.2.1 Прямой код
Прямой код используется для представления чисел в запоминающем устройстве ЭВМ, а также при умножении и делении.
В прямом коде запись b-разрядного числа состоит из одного знакового разряда и (b-1) разрядов цифровой части. В качестве знакового разряда используется старший разряд, в нем знак плюс кодируется нулем, а знак минус – единицей. Например, в четырехразрядной сетке число 1 записывается в виде 0001, а число (–1) – в виде 1001. Как видим, прямой код представляет собой «естественный», простой способ кодирования положительных и отрицательных чисел.
Число разных кодовых наборов, которые могут быть записаны в b-разрядной сетке, равно 2b и включает все наборы от 00…0 до 11…1 длины b.
Наибольшее представимое в прямом коде число – это положительное число 2b-1–1, наименьшее – это [–(2b-1–1)] (проверьте!). Числу 0 соответствуют два разных b-разрядных представления: 00…0 (соответствует записи «+0»), и 10…0 (соответ-
20
