Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Калининградский государственный технический университет» Кафедра систем управления и вычислительной техники Топоркова О.М. Методические указания для выполнения самостоятельных работ ПО ДИСЦИПЛИНЕ «ИНФОРМАТИКА» Калининград 2011 Оглавление 1. Перевод чисел из одной системы счисления в другую .........................................................3 2. Построение прямых кодов и кодирование дискретного сигнала .........................................8 3. Построение кодов с учетом частоты символов и кодирование дискретного сигнала ........9 4. Построение кода Грея и кодирование дискретного сигнала ...............................................10 5. Криптографическое кодирование дискретного сигнала методом простой подстановки .11 6. Криптографическое кодирование дискретного сигнала методом Виженера ....................12 7. Построение эффективных кодов методом Шеннона-Фано и кодирование дискретного сигнала ..........................................................................................................................................13 8. Построение эффективных кодов методом Хаффмена и кодирование дискретного сигнала ..........................................................................................................................................14 9. Измерение дискретного сигнала ............................................................................................16 10. Сложение вещественных чисел в обратных кодах ............................................................17 11. Сложение вещественных чисел в дополнительных кодах ................................................19 1. Перевод чисел из одной системы счисления в другую Задание к работе: выполнить перевод вещественного числа по схеме: двоичная система шестнадцатеричная система исходное число десятичная система шестнадцатеричная система двоичная система При этом: 1) вещественное число получить из номера своей зачетной книжки по следующему правилу: старшие 3 цифры сделать целой частью числа, оставшиеся цифры – дробной частью числа. Например, если номер зачетной книжки 12345, то вещественное число имеет значение 123,45; 2) перевод в двоичную систему выполнять до 9 знаков точности, в шестнадцатеричную – до 3 знаков. Решение задачи Правила перевода различаются в зависимости от формата числа – целое или правильная дробь. Для вещественных чисел используется комбинация правил перевода для целого числа и правильной дроби. 1.1. Правила перевода целых чисел Результатом перевода всегда является целое число. Рассмотрим следующие группы правил: o из десятичной системы – в двоичную и шестнадцатеричную, o из двоичной и шестнадцатеричной системы – в десятичную, o из двоичной системы в шестнадцатеричную и обратно. 1.1.1. Перевод из десятичной системы счисления – в двоичную и шестнадцатеричную: а) число делится на основание системы счисления, в которую переводится (2 или 16); получается частное и остаток; б) если полученное частное меньше основания системы счисления, в которую выполняется перевод, процесс деления прекращается, переходят к шагу в). Иначе над частным выполняют действия, описанные в шаге а); в) все полученные остатки и последнее частное преобразуются в соответствии с таблицей 3.1 в цифры той системы счисления, в которую выполняется перевод: Таблица 3.1 Десятичная Двоичная Шестнадцатеричная система система система 0 0 0 1 1 1 2 10 2 3 11 3 4 100 4 5 101 5 6 110 6 7 111 7 8 1000 8 Десятичная система 9 10 11 12 13 14 15 16 Двоичная система 1001 1010 1011 1100 1101 1110 1111 10000 Шестнадцатеричная система 9 A B C D E F 10 г) формируется результирующее число: его старший разряд – последнее частное, каждый последующий младший разряд образуется из полученных остатков от деления, начиная с последнего и кончая первым. Таким образом, младший разряд полученного числа – первый остаток от деления, а старший – последнее частное. Пример 1.1. Выполнить перевод числа 19 в двоичную систему счисления: _19 2 18 _9 2 1 8 _4 2 1 4 _2 2 0 2 1 0 последнее частное от деления (1<2). Это старший разряд результирующего двоичного числа. 1 0 0 1 1 – результирующее число. Таким образом, 19 = 100112. Пример 1.2. Выполнить перевод числа 19 в шестнадцатеричную систему счисления: _19 16 16 1 3 1 3 – результирующее число. Таким образом, 19 = 1316. Пример 1.3. Выполнить перевод числа 123 в шестнадцатеричную систему счисления: _123 16 112 7 11 7 В – результирующее число. Таким образом, 123 = 7В16. 1.1.2. Перевода из двоичной и шестнадцатеричной систем счисления – в десятичную. В этом случае рассчитывается полное значение числа. Пример 1.4. Выполнить перевод числа 1316 в десятичную систему счисления. Имеем: 1316 = 1*161 + 3*160 = 16 + 3 = 19. Таким образом, 1316 = 19. Пример 1.5. Выполнить перевод числа 100112 в десятичную систему счисления. Имеем: 100112 = 1*24 + 0*23 + 0*22 + 1*21 + 1*20 = 16+0+0+2+1 = 19. Таким образом, 100112 = 19. 1.1.3. Перевод из двоичной системы счисления в шестнадцатеричную: а) исходное число разбивается на тетрады (т.е. 4 цифры), начиная с младших разрядов. Если количество цифр исходного двоичного числа не кратно 4, оно дополняется слева незначащими нулями до достижения кратности 4; б) каждая тетрада заменятся соответствующей шестнадцатеричной цифрой в соответствии с таблицей 3.2: Таблица 3.2 Двоичная Шестнадцатеричная система система 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F Пример 1.6. Выполнить перевод числа 100112 в шестнадцатеричную систему счисления. Поскольку в исходном двоичном числе количество цифр не кратно 4, дополняем его слева незначащими нулями до достижения кратности 4 числа цифр. Имеем: 100112 = 000100112 первая тетрада – младшая цифра числа вторая тетрада – старшая цифра числа В соответствии с таблицей 3.2 00112=316 и 00012=116. Тогда 100112 = 1316. 1.1.4. Перевод из шестнадцатеричной системы счисления в двоичную: а) каждая цифра исходного числа заменяется тетрадой двоичных цифр в соответствии с таблицей 3.2.; б) незначащие нули в результирующем числе отбрасываются. Пример 1.7. Выполнить перевод числа 1316 в двоичную систему счисления. По таблице 3.2 имеем: 116=00012; 316=00112. Тогда 1316 = 000100112. После удаления незначащих нулей имеем 1316 = 100112. 1.2. Правила перевода правильных дробей Результатом перевода всегда является правильная дробь. Рассмотрим следующие группы правил: o из десятичной системы – в двоичную и шестнадцатеричную, o из двоичной и шестнадцатеричной системы – в десятичную, o из двоичной системы в шестнадцатеричную и обратно. 1.2.1. Перевод из десятичной системы счисления – в двоичную и шестнадцатеричную: а) исходная дробь умножается на основание системы счисления, в которую переводится (2 или 16); б) в полученном произведении целая часть преобразуется в соответствии с таблицей 3.1 в цифру нужной системы счисления и вычитается – она является старшей цифрой получаемой дроби. Получается правильная дробь; в) оставшаяся дробь вновь умножается на нужное основание системы счисления с последующей обработкой полученного произведения в соответствии с шагами а) и б). г) процедура умножения продолжается до тех пор, пока ни будет получен нулевой результат в дробной части произведения или пока ни будет достигнуто требуемое количество цифр в результате; д) формируется результат: последовательно отброшенные в шаге б) цифры составляют дробную часть результата, причем в порядке уменьшения старшинства. Пример 1.8. Выполнить перевод числа 0,847 в двоичную систему счисления. Перевод выполнить до четырех значащих цифр после запятой. Имеем: *0,847 2 1,694 *0,694 2 1,388 *0,388 2 0,776 *0,776 2 1,552 0,1101 – результирующее число. В данном примере процедура перевода прервана на четвертом шаге, поскольку получено требуемое число разрядов результата. Очевидно, это привело к потере ряда цифр. Таким образом, 0,847=0,11012. Пример 1.9. Выполнить перевод числа 0,847 в шестнадцатеричную систему счисления. Перевод выполнить до трех значащих цифр. *0,847 16 13,552 *0,552 16 D 8,832 *0,832 16 8 13,312 D 0,D8D – результирующее число. В данном примере также процедура перевода прервана. Таким образом, 0,847=0,D8D16. 1.2.2. Перевод из двоичной и шестнадцатеричной систем счисления – в десятичную. В этом случае рассчитывается полное значение числа. Пример 1.10. Выполнить перевод из двоичной системы счисления в десятичную числа 0,11012. Имеем: 0,11012=1*2-1+1*2-2+0*2-3+1*2-4=0,5+0,25+0+0,0625=0,8125. Расхождение полученного результата с исходным для получения двоичной дроби числом (см. пример 1.8) вызвано тем, что процедура перевода в двоичную дробь была прервана. Таким образом, 0,11012=0,8125. Пример 1.11. Выполнить перевод из шестнадцатеричной системы счисления в десятичную числа 0,D8D16. Имеем: 0,D8D16=13*16-1+8*16-2+13*16-3=13*0,0625+8*0,003906+13* 0,000244=0,84692. Расхождение полученного результата с исходным для получения двоичной дроби числом (см. пример 3.9) вызвано тем, что процедура перевода в шестнадцатеричную дробь была прервана. Таким образом, 0,D8D16 = 0,84692. 1.2.3. Перевод из двоичной системы счисления в шестнадцатеричную: а) исходная дробь делится на тетрады, начиная с позиции десятичной точки вправо. Если количество цифр дробной части исходного двоичного числа не кратно 4, оно дополняется справа незначащими нулями до достижения кратности 4; б) каждая тетрада заменяется шестнадцатеричной цифрой в соответствии с таблицей 3.2. Пример 1.12. Выполнить перевод из двоичной системы счисления в шестнадцатеричную числа 0,11012. Имеем: 0,11012=0,11012 первая (и единственная) тетрада В соответствии с таблицей 3.2 11012=D16. Тогда имеем 0,11012=0,D16. Пример 1.13. Выполнить перевод из двоичной системы счисления в шестнадцатеричную числа 0,00101012. Поскольку количество цифр дробной части не кратно 4, добавим справа незначащий ноль: 0,00101012 = 0,001010102. вторая тетрада первая тетрада В соответствии с таблицей 3.2 00102=216 и 10102=A16. Тогда имеем 0,00101012=0,2A16. 1.2.4. Перевод из шестнадцатеричной системы счисления в двоичную: а) каждая цифра исходной дроби заменяется тетрадой двоичных цифр в соответствии с таблицей 3.2; б) незначащие нули отбрасываются. Пример 1.14. Выполнить перевод из шестнадцатеричной системы счисления в двоичную числа 0,2А16. По таблице 3.2 имеем 216=00102 и А16=10102. Тогда 0,2А16 = 0,001010102. Отбросим в результате незначащий ноль и получим окончательный результат: 0,2А16=0,00101012. 1.3. Правило перевода дробных чисел Отдельно переводится целая часть числа, отдельно – дробная. Результаты складываются. Пример 1.15. Выполнить перевод из десятичной системы счисления в шестнадцатеричную числа 19,847. Перевод выполнять до трех значащих цифр после запятой. Представим исходное число как сумму целого числа и правильной дроби: 19,847=19+0,847. Как следует из примера 1.2, 19=1316; а в соответствии с примером 1.9 0,847=0,D8D16. Тогда имеем: 19+ 0,847=1316+0,D8D16=13,D8D16. Таким образом, 19,847=13,D8D16. 2. Построение прямых кодов и кодирование дискретного сигнала Задание к работе: для алфавита, используемого при формировании фамилии, имени, отчества студента (далее - исходного текста), построить прямые двоичные коды постоянной длины и закодировать ими исходный текст (т.е. фамилию, имя и отчество). Для простоты в исходном тексте игнорировать регистр и пробелы между словами. Решение задачи Пусть фамилия, имя и отчество студента Петров Иван Васильевич. Тогда исходным текстом является текст петровиванвасильевич, а алфавит - это множество символов {п, е, т, р, о, в, и, а, н, с, л, ь, ч}. Для построения прямых кодов выполним следующую последовательность действий: 1) выполним лексикографическое упорядочение своего алфавита (графа 1 таблицы 2.1): Таблица 2.1 Символ алфаНомер Прямой код вита по порядку 1 а в е и л н о п р с т ч ь 2 0 1 2 3 4 5 6 7 8 9 10 11 12 3 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 2) пронумеруем символы алфавита, начиная с нуля (графа 2 таблицы 2.1), 3) определим мощность N алфавита (т.е. число символов алфавита): N = 13, 4) используя комбинаторный подход к измерению информации, рассчитаем требуемый размер кода, достаточный для кодирования всех символов исходного алфавита, по формуле: l = [log2 N], где скобки [ ] означают округление резуль- тата до ближайшего большего целого числа. Для нашего примера l = [log2 13] = [3,7] = 4, 5) каждый номер символа представим четырехразрядным (как следует из шага 4) двоичным числом - получим код постоянной длины (графа 3 таблицы 2.1). Кодирование исходного текста дает (для простоты закодируем отдельно фамилию, имя, отчество)1: петров 0111 0010 1010 1000 0110 0001 иван 0011 0001 0000 0101 васильевич 0001 0000 1001 0011 0100 1100 0010 0001 0011 1011 3. Построение кодов с учетом частоты символов и кодирование дискретного сигнала Задание к работе: построить для алфавита, полученного в задании 2, двоичные коды, учитывающие частоту символов. Расчет частоты выполнить по исходному тексту. Закодировать полученным кодом исходный текст. Решение задачи Для построения требуемых кодов выполним следующую последовательность действий: 1) для расчета частот символов алфавита (графа 1 таблицы 3.1) определим число появлений mi каждого i-го символа алфавита в исходном тексте (графа 2 таблицы 3.1): Символ алфавита 1 а в е и л н о п р с т ч ь Таблица 3.1 Число появлений mi 2 2 4 2 3 1 1 1 1 1 1 1 1 1 2) для определения размера кода вновь используем формулу l=[log2 N] при N=13. Получаем: l = [logh 13] = [3,7] = 4, 3) упорядочим список символов алфавита А по убыванию частоты. Получим графы 1,2 таблицы 3.2 , 4) назначим символам коды постоянной длины, число единиц в которых тем больше, чем меньше частота символа (графа 3 таблицы 3.2). 1 Здесь и далее между кодовыми комбинациями введены пробелы только для удобства восприятия Символ алфавита 1 в и а е л н о п р с т ч ь Число появлений mi 2 4 3 2 2 1 1 1 1 1 1 1 1 1 Таблица 3.2 Код 3 0000 0001 0010 0100 1000 1010 1001 0110 0101 0011 1100 1011 1101 Кодирование исходного текста полученным кодом дает результат (отдельно закодированы фамилия, имя и отчество): петров 0110 0100 1100 0101 1001 0000 иван 0001 0000 0010 1010 васильевич 0000 0010 0011 0001 1000 1101 0100 0000 0001 1011 4. Построение кода Грея и кодирование дискретного сигнала Задание к работе: для символов алфавита (из задания 2) построить код Грея. Закодировать полученным кодом исходный текст. Решение задачи Для построения кода Грея выполним следующие шаги: 1) исходя из мощности алфавита, определим размер nxm таблицы для построения кода Грея, где n – число строк, m – число столбцов таблицы. Для этого будем последовательно наращивать число столбцов и число строк, начиная с одной строки и одного столбца, каждый раз проверяя, не достигнут ли требуемый размер таблицы. При этом схема наращивания числа строк и столбцов будет определяться следующим образом: число столбцов на каждом шаге итерации равно или на 1 превышает число строк (таблица 4.1). Таблица 4.1 Номер шага Число столбцов m Число строк n Размер таблицы nxm 1 2 3 4 1 1 1 1 2 2 1 2 3 2 2 4 4 3 2 6 5 3 3 9 6 4 3 12 7 4 4 16 > 13 Поскольку на седьмом шаге итерации удалось достичь требуемого размера таблицы, определение ее размеров закончено. Таким образом, получена таблица размером 4х4, 2) строки и столбцы таблицы пронумеруем двоичными числами из множества {00, 01, 10, 11}, элементы которого сами являются кодами Грея (затушеванные ячейки таблицы 4.2), Таблица 4.2 00 01 11 10 00 а в е и 01 п о н л 11 р с т ч 10 ь 3) разместим в ячейках таблицы упорядоченные по алфавиту символы исходного множества (см. графу 1 таблицы 4.3) в направлении, указанном стрелками в таблице 4.2, 4) для формирования кода Грея по каждому символу объединим номера строки и столбца ячейки, в которой находится символ. Получим графу 2 таблицы 4.3. Таблица 4.3 Символ алфаКод Грея вита 1 2 0000 а 0001 в 0011 е 0010 и 0110 л 0111 н 0101 о 0100 п 1100 р 1101 с 1111 т 1110 ч 1010 ь Кодирование исходного текста полученным кодом дает результат: петров 0100 0011 1111 1100 0101 0001 иван 0010 0001 0000 0111 васильевич 0001 0000 1101 0010 0110 1010 0011 0001 0010 1110 5. Криптографическое кодирование дискретного сигнала методом простой подстановки Задание к работе: выполнить криптографическое кодирование исходного текста методом простой подстановки. Исходным алфавитом принять алфавит из задания 2. В качестве символов кодирования принять l-разрядные двоичные кодовые комбинации (величина l определена в задании 2), значение которых находится в пределах от 0 до двоичного эквивалента числа N-1, где N – мощность исходного алфавита. Решение задачи 1) для построения кода составим таблицу соответствия между символами исходного алфавита (графа 1 таблицы 5.1), их произвольными номерами в пре- делах от 0 до 12 (графа 2 таблицы 5.1) (назначение номера выполнено случайным образом, но номера не должны повторяться) и 4-разрядными кодами этих номеров (графа 3 таблицы 5.1). В графе 4 укажем прямые коды символов исходного алфавита из таблицы 2.1: Таблица 5.1 а в е и л н о п р с т ч ь Символы исходного алфавита 1 Произвольный Коды Прямой код номер символа 2 9 11 12 1 10 6 7 0 2 3 4 5 8 3 1001 1011 1100 0001 1010 0110 0111 0000 0010 0011 0100 0101 1000 4 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 2) для кодирования исходного текста вначале запишем исходный текст с помощью кодов из графы 3 таблицы 5.1. Получаем: петров 0000 1100 0100 0010 0111 1011 иван 0001 1011 1001 0110 васильевич 1011 1001 0011 0001 1010 1000 1100 1011 0001 0101 Теперь заменим каждую кодовую комбинацию соответствующим символом, сообразуясь с данными графы 4 таблицы 5.1. Получаем: петров аьлепч иван вчсо васильевич чсивтрьчвн 6. Криптографическое кодирование дискретного сигнала методом Виженера Задание к работе: выполнить криптографическое кодирование исходного текста методом Виженера. Исходным алфавитом принять множество символов из задания 2. В качестве ключа кодирования использовать имя собственное. Решение задачи 1) для построения кода пронумеруем символы исходного алфавита, начиная с 0. Получим таблицу соответствия (таблица 6.1), Таблица 6.1 символы исхода в е и л н о п р с т ч ь ного алфавита номера симво0 1 2 3 4 5 6 7 8 9 10 11 12 лов 2) для кодирования выполняем шаги: выписываем исходный текст (строка 1 таблицы 6.2), формируем номера символов исходного текста из таблицы 5.1 (строка 2 таблицы 6.2), многократно записываем ключ под исходным текстом (строка 3 таблицы 6.2), заполняем номера символов ключа из таблицы 5.1 (строка 4 таблицы 6.2), складываем по модулю 13 (это мощность алфавита) номера символов (строка 5 таблицы 6.2), заменяем полученные числа символами исходного алфавита из таблицы 6.1 (строка 6 таблицы 6.2). Таким образом, получаем строку, соответствующую исходному тексту: тиоасеиоиовньлллнеии Таблица 6.2 Номер строки 1 2 3 4 5 6 Результаты выполнения кодирования п 7 и 3 10 т е 2 в 1 3 и т 10 а 0 10 о р 8 н 5 0 а о 6 и 3 9 с в 1 в 1 2 е и 3 а 0 3 и в 1 н 5 6 о а 0 и 3 3 и н 5 в 1 6 о в 1 а 0 1 в а 0 н 5 5 н с 9 и 3 12 ь и 3 в 1 4 л л 4 а 0 4 л ь 12 н 5 4 л е 2 и 3 5 н в 1 в 1 2 е и 3 а 0 3 и ч 11 н 5 3 и Получаем результат (отдельно закодирована фамилия, имя и отчество): петров тиоасе иван иоио васильевич вньлллнеии 7. Построение эффективных кодов методом ШеннонаФано и кодирование дискретного сигнала Задание к работе: выполнить кодирование исходного текста методом ШеннонаФано. Относительные частоты символов алфавита, из которых состоит исходный текст, рассчитать по исходному тексту. Решение задачи 1) для построения эффективного кода выполним следующие шаги: определим размер (в символах) исходного текста (переменная L) – он равен 20, определим относительные частоты fi появления каждого символа в исходном тексте по формуле: fi = mi/L, где mi – число появлений i-го символа в исходном тексте из таблицы 3.2. Имеем графу 3 таблицы 7.1: Таблица 7.1 Символ Число Частота сималфавита появлений mi вола fi 1 2 3 2 0,1 а 4 0,2 в 2 0,1 е 3 0,15 и 1 0,05 л 1 0,05 н 1 0,05 о 1 0,05 п 1 0,05 р 1 0,05 с 1 0,05 т 1 0,05 ч 1 0,05 ь упорядочим символы алфавита по невозрастанию частот. Получим графы 1 и 2 таблицы 7.2: выполним последовательное деление списка символов в соответствии с алгоритмом Шеннона-Фано (графа 3 таблицы 7.2) и назначим символы 0 или 1 элементам списка символов – кодируем элементы, «соберем» символы 0 и 1 слева направо в графе 3 для каждого символа алфавита. Получим графу 4 таблицы 7.2. Таблица 7.2 Символ Частота РезультируюЭтапы деления списка символов алфавита символа fi щие коды 3 1 2 4 I II III IV V 0,2 0 00 в 0,15 0 0 010 и 1 0,1 1 011 а 0,1 0 100 е 0,05 0 1010 л 0 0,05 1 0 10110 н 1 0,05 1 10111 о 0,05 0 1100 п 1 0,05 0 0 11010 р 1 0,05 1 11011 с 1 0,05 0 1110 т 0,05 1 0 11110 ч 1 0,05 1 11111 ь 2) для кодирования исходного текста используем таблицу 7.2. Имеем (для простоты закодируем отдельно фамилию, имя и отчество): петров 1100 100 1110 11010 10111 00 иван 010 00 011 10110 васильевич 00 011 11011 010 1010 11111 100 00 010 11110 8. Построение эффективных кодов методом Хаффмена и кодирование дискретного сигнала Задание к работе: выполнить кодирование исходного текста методом Хаффмена. Частоты символов алфавита заимствовать из задания 7. Решение задачи: 1) для построения кода выполним следующие шаги: используем в качестве исходных данных графы 1 и 2 таблицы 7.2, расположив их в графах 1 и 2 таблицы 8.1, выполним последовательное объединение частот в соответствии с методом Хаффмена (графа 3 таблицы 8.1, красным цветом показана объединенная частота), Таблица 8.1 Символ Частота алфавита символа fi 1 2 в Этапы объединения частот 3 I II III IV V VI VII VIII IX X XI XII 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,2 0,25 0,35 0,4 0,6 1 и 0,15 0,15 0,15 0,15 0,15 0,15 0,2 0,2 0,2 0,25 0,35 0,4 - а 0,1 0,1 0,1 0,1 0,1 0,15 0,15 0,2 0,2 0,2 0,25 - - е 0,1 0,1 0,1 0,1 0,1 0,1 0,15 0,15 0,2 0,2 - - - л 0,05 0,1 0,1 0,1 0,1 0,1 0,1 0,15 0,15 - - - - н 0,05 0,05 0,1 0,1 0,1 0,1 0,1 0,1 - - - - - о 0,05 0,05 0,05 0,1 0,1 0,1 0,1 - - - - - - п 0,05 0,05 0,05 0,05 0,1 0,1 - - - - - - - р 0,05 0,05 0,05 0,05 0,05 - - - - - - - - с 0,05 0,05 0,05 0,05 - - - - - - - - - т 0,05 0,05 0,05 - - - - - - - - - - ч 0,05 0,05 - - - - - - - - - - - ь 0,05 - - - - - - - - - - - - построим бинарное дерево и закодируем его ребра (рисунок 8.1, коды ребер заключены в окружности), 1 1 0 0,6 1 0,35 1 1 0,2 0 0,1(е) 0,1 1 0 0,05(ч) 1 0,25 1 0 0,15(и) 0,05(ь) 0,4 0 0,1 1 0 0,2(в) 0 0,2 0 1 0,15 0,1(а) 0,1 1 0 0 0,05(л) 0,05(с) 0,05(т) 1 0,1 0 0,05(п) 0,05(р) 0 1 0,05(н) 0,05(о) Рисунок 8.1. Кодовое бинарное дерево для задания начиная с корня дерева, «соберем» коды ребер и сформируем коды символов исходного алфавита (таблица 8.2): Таблица 8.2 Символ в алфавита Код и а е л н о п р с т ч ь 01 110 100 1111 1010 10111 10110 0001 0000 0011 0010 11101 11100 2) для кодирования исходного текста используем таблицу 8.2. Имеем (для простоты закодируем отдельно фамилию, имя и отчество): петров 0001 1111 0010 0000 10110 01 иван 110 01 100 10111 васильевич 01 100 0011 110 1010 11100 1111 01 110 11101 9. Измерение дискретного сигнала Задание к работе: выполнить измерение информации в дискретном сигнале и определить эффективность кодирования символов исходного алфавита (из задания 2) разными кодами, построенными в предыдущих заданиях. Решение задачи Для измерения информации в дискретном сигнале используем геометрическую меру и подсчитаем число символов в соответствующих закодированных сообщениях (нижний индекс означает номер задания): L2=80 двоичных символов, L3=80 двоичных символов, L4=80 двоичных символов, L5=80 двоичных символов = 20 алфавитных символов, L6=80 двоичных символов = 20 алфавитных символов, L7=71 двоичный символ, L8=71 двоичный символ. Измерим количество информации, содержащейся в 1 кодовой комбинации построенных в предыдущих заданиях кодов: 1) для кодов постоянной длины (задания 2–5) подсчитаем число двоичных разрядов в кодовых комбинациях. Получим: l2 = l3 = l4 = l4 = 4 двоичных символа, 2) для эффективных кодов (задания 7,8) используем среднее число двоичных разрядов lср, применяемое для кодирования символов исходного алфавита, которое рассчитывается по формуле: N l ср f i n i i 1 , где fi – частота символа, ni – число двоичных разрядов в коде i – го символа, N – число символов в исходном алфавите А, для задания 7 (см. таблицу 7.2): lср = 0,2*2+0,15*3+0,1*3*2+0,05*4*3+0,05*5*6=3,55 бита, для задания 8 (см. таблицы 8.1,8.2): lср = 0,2*2+0,15*3+0,1*3+0,1*4+0,05*4*5+0,05*5*4=3,55 бита, 3) для определения общей эффективности кодов применим статистическую меру измерения информации, содержащейся в одном символе исходного алфавита: это значение определит lпр - предельное количество двоичных разрядов, достаточное для кодирования символов исходного алфавита. Для расчета используем формулу: N lпр f i log 2 f i . i 1 Тогда получим (см. частоты в таблице 7.1): lпр = -(2*(0,1* log20,1) + 0,2* log20,2 + 0,15*log20,15 + 9*(0,05*log20,05)) = 3,48418 бита. Таким образом, все построенные коды являются избыточными. Однако минимальной избыточностью обладают эффективные коды: они минимально отличаются от предельного значения числа двоичных разрядов. 10. Сложение вещественных чисел в обратных кодах Задание к работе: выполнить сложение в обратном коде двух отрицательных чисел, сформированных из пятиразрядного номера зачетной книжки по правилу: целая часть первого числа образуется из старших трех разрядов, дробная часть – из оставшихся разрядов; целая часть второго числа совпадает с дробной частью первого числа, а его дробная часть совпадает с целой частью первого числа. Например, если номер зачетной книжки равен 01234, то первое число равно –12,34; второе число равно –34,12. Разрядная сетка имеет структуру 6х10, где 6 – число разрядов порядка, 10 – число разрядов мантиссы. При переводе дробной части слагаемых ориентироваться на необходимость заполнения разрядной сетки мантиссы. Результат сложения перевести в десятичную систему счисления и сравнить с тем, что должно было бы получиться. Решение задачи 1) перевод слагаемых в двоичную систему счисления: перевод целой части выполним на примере числа 34 последовательным делением делимого на 2: Таблица 10.1 Номер Делимое Целая часть Остаток шага частного 1 34 17 0 2 17 8 1 3 8 4 0 4 4 2 0 5 2 1 0 Получаем: 34 = 1000102. перевод дробной части выполним на примере числа 0,12 последовательным умножением множимого на 2. При этом перевод заканчивается, когда сумма двоичных разрядов целой части и дробной будет равна 9 (т.е. количеству разрядов для мантиссы минус 1 разряд на знак), или число разрядов дробной части будет равно 3 (по тем же соображениям): Таблица 10.2 Номер МножиЦелая часть Дробная часть шага мое произведения произведения 1 0,12 24 0 2 0,24 48 0 3 0,48 96 0 Поскольку число двоичных разрядов (см. целые части произведения в таблице 10.2) равно 3, процедура перевода дробной части заканчивается. Таким образом: 0,12 = 0,0002. Перевод второго слагаемого, выполненный по той же схеме, дает: 12,34 = 1100,010102 2) нормализация двоичных чисел и размещение их в разрядных сетках: нормализация -100010,000 -0,100010000Е+110 -1100,01010 -0,110001010Е+100 размещение в разрядных сетках порядок мантисса -34,12 -12,34 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 знаковые разряды 3) определение большего порядка путем вычитания из одного порядка другого и анализа разности: 110 – 100. Поскольку в решении задачи участвуют отрицательные числа, выполним перевод вычитаемого в обратный код и произведем сложение порядков по правилам сложения чисел в обратном коде: Прямые коды слагаемых Обратные коды слагаемых Сумма 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 Поскольку сумма положительна, большим является первый порядок (у слагаемого –34,12), а потому на следующем шаге работа ведется со вторым слагаемым –12,34; 4) выравнивание порядков и сдвиг мантиссы для слагаемого с меньшим порядком: выравнивание порядков 0 0 0 1 0 0 Прямые коды слагаемых 0 0 0 0 1 0 Сумма (второй порядок) 0 0 0 1 1 0 1 1 1 1 0 0 сдвиг мантиссы 0 0 0 1 1 1 0 0 0 1 0 0 1 0 Таким образом, второе слагаемое (с меньшим порядком) приобретает вид: -12,34 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 5) сложение мантисс. Поскольку обе мантиссы отрицательны, сложение выполняется в обратных кодах: Прямые коды слагаемых Обратные коды слагаемых Сумма 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 Поскольку результат отрицателен, он представлен в обратном коде. Выполняется перевод в прямой код. Получаем: 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 6) перевод результата в десятичную систему счисления: -0,101110010Е+6= -101110,01= -(1*25+1*23+1*22+1*21+1*2-2) = -(32+8+4+2+0,25) = -46,25. 7) определим полученную погрешность вычисления. Для этого сложим исходные числа: -34,12+(-12,34)=-46,46. Как видно по результату, имеем погрешность: -46,46 - (-46,25) = -0,21 11. Сложение вещественных чисел в дополнительных кодах Задание к работе: выполнить сложение в дополнительном коде двух отрицательных чисел из предыдущего задания. Разрядная сетка имеет структуру 6х10, где 6 – число разрядов порядка, 10 – число разрядов мантиссы. При переводе дробной части слагаемых ориентироваться на необходимость заполнения разрядной сетки мантиссы. Результат сложения перевести в десятичную систему счисления и сравнить с тем, что должно было бы получиться. Решение задачи Используем результаты первых этапов предыдущего задания. Пусть слагаемые размещены в разрядных сетках и выполнено выравнивание порядков. 1) сложение мантисс. Поскольку обе мантиссы отрицательны, сложение выполняется в дополнительных кодах: 1 1 1 Обратные коды слагаемых 1 1 Дополнительные коды слагаемых 1 Сумма 1 Прямые коды слагаемых 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 Полученная единица переноса при сложении знаковых разрядов отбрасывается. Поскольку результат отрицателен, он представлен в дополнительном коде. Выполняется перевод в прямой код через обратный. Получаем: Обратный код суммы 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 Прямой код суммы 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 2) перевод результата в десятичную систему счисления: -0,101110010Е+6= -101110,01= -(1*25+1*23+1*22+1*21+1*2-2) = -(32+8+4+2+0,25) = -46,25. 3) определим полученную погрешность вычисления. Поскольку результат совпадает с предыдущей задачей, имеем такую же погрешность -0,21