Позиционные системы счисления
Система счисления - принятый способ записи чисел и сопоставления этим записям реальных значений. Все системы счисления можно разделить на два класса: позиционные и непозиционные. Для записи чисел в различных системах счисления используется некоторое количество отличных друг от друга знаков. Число таких знаков в позиционной системе счисления называетсяоснованием системы счисления.Ниже приведена табл. 1.4, содержащая наименования некоторых позиционных систем счисления и перечень знаков (цифр), из которых образуются в них числа.
Таблица 1.4. Некоторые системы счисления
Основание | Система счисления | Знаки |
Двоичная | 0,1 | |
Троичная | 0,1.2 | |
Четвертичная | 0,1,2,3 | |
Пятиричная | 0,1,2,3,4 | |
Восьмиричная | 0,1,2,3,4,5,6,7 | |
Десятичная | 0,1,2,3,4,5,6,7,8,9 | |
Двенадцатиричная | 0,1,2,3,4,5,б,7,8,9,А,В | |
Шестнадцатиричная | 0,1,2,3,4,5,6,7,8,9,A.B,D,E,F |
В позиционной системе счисления число может быть представлено в виде суммы произведений коэффициентов на степени основания системы счисления:
AnAn-1An-2 … A1,A0,A-1,A-2 =
АnВn + An-1Bn-1 + ... + A1B1 + А0В0 + A-1B-1 + А-2В-2 + ...
(знак «точка» отделяет целую часть числа от дробной; знак «звездочка» здесь и ниже используется для обозначения операции умножения). Таким образом, значение каждого знака в числе зависит от позиции, которую занимает знак в записи числа. Именно поэтому такие системы счисления называют позиционными. Примеры (десятичный индекс внизу указывает основание системы счисления):
23,43(10) = 2*101 + З*10° + 4*10-1 + З*10-2
(в данном примере знак «З» в одном случае означает число единиц, а в другом - число сотых долей единицы);
692(10) = 6* 102 + 9*101 + 2.
(«Шестьсот девяносто два» с формальной точки зрения представляется в виде «шесть умножить на десять в степени два, плюс девять умножить на десять в степени один, плюс два»).
1101(2)= 1*23 + 1*22+0*21+ 1*2°;
112(3) = l*32+ 1*31 +2*3°;
341,5(8) =3*82+ 4*81 +1*8° +5*8-1;
A1F4(16) = A*162 + 1*161 + F*16° + 4*16-1.
При работе с компьютерами приходится параллельно использовать несколько позиционных систем счисления (чаще всего двоичную, десятичную и шестнадцатиричную), поэтому большое практическое значение имеют процедуры перевода чисел из одной системы счисления в другую.Заметим, что во всех приведенных выше примерах результат является десятичным числом, и, таким образом, способ перевода чисел из любой позиционной системы счисления в десятичную уже продемонстрирован.
Чтобы перевести целую часть числа из десятичной системы в систему с основанием В, необходимо разделить ее на В. Остаток даст младший разряд числа. Полученное при этом частное необходимо вновь разделить на В - остаток даст следующий разряд числа и т.д. Для перевода дробной части ее необходимо умножить на В. Целая часть полученного произведения будет первым (после запятой, отделяющей целую часть от дробной) знаком. Дробную же часть произведения необходимо вновь умножить на В. Целая часть полученного числа будет следующим знаком и т.д.
Отметим, что кроме рассмотренных выше позиционных систем счисления существуют такие, в которых значение знака не зависит от того места, которое он занимает в числе. Такие системы счисления называются непозиционными. Наиболее известным примером непозиционной системы является римская. В этой системе используется 7 знаков (I, V, X, L, С, D, М), которые соответствуют следующим величинам:
1(1) V(5) X(10) L(50) С (100) D(500) M(1000)
Примеры: III (три), LIX (пятьдесят девять), DLV (пятьсот пятьдесят пять).
Недостатком непозиционных систем, из-за которых они представляют лишь исторический интерес, является отсутствие формальных правил записи чисел и, соответственно, арифметических действий над ними (хотя по традиции римскими числами часто пользуются при нумерации глав в книгах, веков в истории и др.).
ДВОИЧНАЯ СИСТЕМА СЧИСЛЕНИЯ
Особая значимость двоичной системы счисления в информатике определяется тем, что внутреннее представление любой информации в компьютере является двоичным, т.е. описываемым наборами только из двух знаков (0 и 1).
Конкретизируем описанный выше способ в случае перевода чисел из десятичной системы в двоичную. Целая и дробная части переводятся порознь. Для перевода целой части (или просто целого) числа необходимо разделить ее на основание системы счисления и продолжать делить частные от деления до тех пор, пока частное не станет равным 0. Значения получившихся остатков, взятые в обратной последовательности, образуют искомое двоичное число. Например:
Остаток
25 : 2 = 12 (1),
12 : 2 = 6 (0),
6 : 2 = 3 (0),
3 : 2 = 1 (1),
1 : 2 = 0 (1).
Таким образом
25(10)=11001(2).
Для перевода дробной части (или числа, у которого «0» целых) надо умножить ее на 2. Целая часть произведения будет первой цифрой числа в двоичной системе. Затем, отбрасывая у результата целую часть, вновь умножаем на 2 и т.д. Заметим, что конечная десятичная дробь при этом вполне может стать бесконечной {периодической) двоичной. Например:
0,73 • 2 = 1,46 (целая часть 1),
0,46 • 2 = 0,92 (целая часть 0 ),
0,92 • 2 = 1,84 (целая часть 1),
0,84 • 2 = 1,68 (целая часть 1) и т.д.
В итоге
0,73(10) =0,1011...(2).
Над числами, записанными в любой системе счисления, можно; производить различные арифметические операции. Так, для сложения и умножения двоичных чисел необходимо использовать табл. 1.5.
Таблица 1.5. Таблицы сложения и умножения в двоичной системе
Заметим, что при двоичном сложении 1 + 1 возникает перенос единицы в старший разряд - точь-в-точь как в десятичной арифметике:
3.3. ВОСЬМЕРИЧНАЯ И ШЕСТНАДЦАТИРИЧНАЯ
СИСТЕМЫ СЧИСЛЕНИЯ
С точки зрения изучения принципов представления и обработки информации в компьютере, обсуждаемые в этом пункте системы представляют большой интерес.
Хотя компьютер «знает» только двоичную систему счисления, часто с целью уменьшения количества записываемых на бумаге или вводимых с клавиатуры компьютера знаков бывает удобнее пользоваться восьмеричными или шестнадцатиричными числами, тем более что, как будет показано далее, процедура взаимного перевода чисел из каждой из этих систем в двоичную очень проста - гораздо проще переводов между любой из этих трех систем и десятичной.
Перевод чисел из десятичной системы счисления в восьмеричную производится (по аналогии с двоичной системой счисления) с помощью делений и умножений на 8. Например, переведем число 58,32(10):
58 : 8 = 7 (2 в остатке),
7 : 8 = 0 (7 в остатке).
0,32 • 8 = 2,56,
0,56 • 8 = 4,48,
0,48-8=3,84,...
Таким образом,
58,32(10) =72,243... (8)
(из конечной дроби в одной системе может получиться бесконечная дробь в другой).
Перевод чисел из десятичной системы счисления в шестнадцатеричную производится аналогично.
С практической точки зрения представляет интерес процедура взаимного преобразования двоичных, восьмеричных и шестнадцатиричных чисел. Для этого воспользуемся табл. 1.6 чисел от 0 до 15 (в десятичной системе счисления), представленных в других системах счисления.
Для перевода целого двоичного числа в восьмеричное необходимо разбить его справа налево на группы по 3 цифры (самая левая группа может содержать менее трех двоичных цифр), а затем каждой группе поставить в соответствие ее восьмеричный эквивалент. Например:
11011001= 11011001, т.е. 11011001(2) =331(8).
Заметим, что группу из трех двоичных цифр часто называют «двоичной триадой».
Перевод целого двоичного числа в шестнадцатиричное производится путем разбиения данного числа на группы по 4 цифры - «двоичные тетрады»:
1100011011001 = 1 1000 1101 1001, т.е. 1100011011001(2)= 18D9(16).
Для перевода дробных частей двоичных чисел в восьмеричную или шестнадцатиричную системы аналогичное разбиение на триады или тетрады производится от точки вправо (с дополнением недостающих последних цифр нулями):
0,1100011101(2) =0,110 001 110 100 = 0,6164(8),
0,1100011101(2) = 0,1100 0111 0100 = 0,C74(16).
Перевод восьмеричных (шестнадцатиричных) чисел в двоичные производится обратным путем - сопоставлением каждому знаку числа соответствующей тройки (четверки) двоичных цифр.
Таблица 1.6 Соответствие чисел в различных системах счисления
Десятичная | Шестнадцатиричная | Восьмеричная | Двоичная |
А | |||
В | L011 | ||
С | |||
D | |||
E | |||
F |
Преобразования чисел из двоичной в восьмеричную и шестнадцатиричную системы и наоборот столь просты (по сравнению с операциями между этими тремя системами и привычной нам десятичной) потому, что числа 8 и 16 являются целыми степенями числа 2. Этой простотой и объясняется популярность восьмеричной и шестнадцатиричной систем в вычислительной технике и программировании.
Арифметические действия с числами в восьмеричной и шестнадцатиричной системах счисления выполняются по аналогии с двоичной и десятичной системами. Для этого необходимо воспользоваться соответствующими таблицами. Для примера табл. 1.7 иллюстрирует сложение и умножение восьмеричных чисел.
Рассмотрим еще один возможный способ перевода чисел из одной позиционной системы счисления в другую - метод вычитания степеней. В этом случае из числа последовательно вычитается максимально допустимая степень требуемого основания, умноженная на максимально возможный коэффициент, меньший основания; этот коэффициент и является значащей цифрой числа в новой системе. Например, число 114(10):
114 - 26 = 114 – 64 = 50,
50 - 25 = 50 – 32 = 18,
18 - 24 = 2,
2 - 21 = 0.
Таким образом, 114(10) = 1110010(2).
114 – 1 ∙ 82 = 114 – 64 = 50,
50 – 6 ∙ 81 = 50 – 48 = 2,
2 – 2 ∙ 8° = 2 – 2 = 0.
Итак, 114(10)= 162(8).
Таблица 1.7 Таблицы сложения и умножения в восьмеричной системе
Сложение Умножение
Контрольные вопросы
1. В чем отличие позиционной системы счисления от непозиционной?
2. Каковы способы перевода чисел из одной системы счисления в другую?
3. В чем заключается преимущество использования восьмеричной и шестнадцатиричной систем счисления в вычислительной технике?
4. Как выглядят таблицы сложения и умножения в шестнадцатиричной системе?
КОДИРОВАНИЕ ИНФОРМАЦИИ.
АБСТРАКТНЫЙ АЛФАВИТ
Информация передается в виде сообщений. Дискретная информация записывается с помощью некоторого конечного набора знаков, которые будем называть буквами, не вкладывая в это слово привычного ограниченного значения (типа «русские буквы» или «латинские буквы»). Буква в данном расширенном понимании - любой из знаков, которые некоторым соглашением установлены для общения. Например, при привычной передаче сообщений на русском языке такими знаками будут русские буквы - прописные и строчные, знаки препинания, пробел; если в тексте есть числа - то и цифры. Вообще, буквой будем называть элемент некоторого конечного множества (набора) отличных друг от друга знаков. Множество знаков, в котором определен их порядок, назовем алфавитом (общеизвестен порядок знаков в русском алфавите: А, Б,..., Я).
Рассмотрим некоторые примеры алфавитов.
1, Алфавит прописных русских букв:
А Б В Г Д Е Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
2. Алфавит Морзе:
3. Алфавит клавиатурных символов ПЭВМ IBM (русифицированная клавиатура):
4. Алфавит знаков правильной шестигранной игральной кости:
5. Алфавит арабских цифр:
6. Алфавит шестнадцатиричных цифр:
0123456789ABCDEF
Этот пример, в частности, показывает, что знаки одного алфавита могут образовываться из знаков других алфавитов.
7. Алфавит двоичных цифр:
0 1
Алфавит 7 является одним из примеров, так называемых, «двоичных» алфавитов, т.е. алфавитов, состоящих из двух знаков. Другими примерами являются двоичные алфавиты 8 и 9:
8. Двоичный алфавит «точка, «тире»:. _
9. Двоичный алфавит «плюс», «минус»: + -
10. Алфавит прописных латинских букв:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
11. Алфавит римской системы счисления:
I V Х L С D М
12. Алфавит языка блок-схем изображения алгоритмов:
13. Алфавит языка программирования Паскаль (см. в главе 3).
КОДИРОВАНИЕ И ДЕКОДИРОВАНИЕ
В канале связи сообщение, составленное из символов (букв) одного алфавита, может преобразовываться в сообщение из символов (букв) другого алфавита. Правило, описывающее однозначное соответствие букв алфавитов при таком преобразовании, называют кодом. Саму процедуру преобразования сообщения называют перекодировкой. Подобное преобразование сообщения может осуществляться в момент поступления сообщения от источника в канал связи (кодирование) и в момент приема сообщения получателем (декодирование). Устройства, обеспечивающие кодирование и декодирование, будем называть соответственно кодировщиком и декодировщиком. На рис. 1.5 приведена схема, иллюстрирующая процесс передачи сообщения в случае перекодировки, а также воздействия помех (см. следующий пункт).
Рис. 1.5. Процесс передачи сообщения от источника к приемнику
Рассмотрим некоторые примеры кодов.
1. Азбука Морзе в русском варианте (алфавиту, составленному из алфавита русских заглавных букв и алфавита арабских цифр ставится в соответствие алфавит Морзе):
2. Код Трисиме (знакам латинского алфавита ставятся в соответствие комбинации из трех знаков: 1,2,3):
А | D | G | J211 | M221 | P231 | S311 | V321 | Y331 | |||
В | E | H | K212 | N222 | Q232 | T312 | W322 | Z332 | |||
С | F | I | L213 | О223 | R233 | U313 | X323 | .333 |
Код Трисиме является примером, так называемого, равномерного кода (такого, в котором все кодовые комбинации содержат одинаковое число знаков - в данном случае три). Пример неравномерного кода - азбука Морзе.
3. Кодирование чисел знаками различных систем счисления см. §3.
ПОНЯТИЕ О ТЕОРЕМАХ ШЕННОНА
Ранее отмечалось, что при передаче сообщений по каналам связи могут возникать помехи, способные привести к искажению принимаемых знаков. Так, например, если вы попытаетесь в ветреную погоду передать речевое сообщению человеку, находящемуся от вас на значительном расстоянии, то оно может быть сильно искажено такой помехой, как ветер. Вообще, передача сообщений при наличии помех является серьезной теоретической и практической задачей. Ее значимость возрастает в связи с повсеместным внедрением компьютерных телекоммуникаций, в которых помехи неизбежны. При работе с кодированной информацией, искажаемой помехами, можно выделить следующие основные проблемы: установления самого факта того, что произошло искажение информации; выяснения того, в каком конкретно месте передаваемого текста это произошло; исправления ошибки, хотя бы с некоторой степенью достоверности.
Помехи в передачи информации - вполне обычное дело во всех сферах профессиональной деятельности и в быту. Один из примеров был приведен выше, другие примеры - разговор по телефону, в трубке которого «трещит», вождение автомобиля в тумане и т.д. Чаще всего человек вполне справляется с каждой из указанных выше задач, хотя и не всегда отдает себе отчет, как он это делает (т.е. неалгоритмически, а исходя из каких-то ассоциативных связей). Известно, что естественный язык обладает большойизбыточностью (в европейских языках - до 7%), чем объясняется большая помехоустойчивость сообщений, составленных из знаков алфавитов таких языков. Примером, иллюстрирующим устойчивость русского языка к помехам, может служить предложение «в словох всо глосноо зомононо боквой о». Здесь 26% символов «поражены», однако это не приводит к потере смысла. Таким образом, в данном случае избыточность является полезным свойством.
Избыточность могла бы быть использована и при передаче кодированных сообщений в технических системах. Например, каждый фрагмент текста («предложение») передается трижды, и верным считается та пара фрагментов, которая полностью совпала. Однако, большая избыточность приводит к большим временным затратам при передаче информации и требует большого объема памяти при ее хранении. Впервые теоретическое исследование эффективного кодирования предпринял К.Шеннон.
Первая теорема Шеннона декларирует возможность создания системы эффективного кодирования дискретных сообщений, у которой среднее число двоичных символов на один символ сообщения асимптотически стремится к энтропии источника сообщений (в отсутствии помех).
Задача эффективного кодирования описывается триадой:
Х = {X 4i} - кодирующее устройство - В.
Здесь X, В - соответственно входной и выходной алфавит. Под множеством хi можно понимать любые знаки (буквы, слова, предложения). В - множество, число элементов которого в случае кодирования знаков числами определяется основанием системы счисления (например, т = 2). Кодирующее устройство сопоставляет каждому сообщению хi из Х кодовую комбинацию, составленную из пi символов множества В. Ограничением данной задачи является отсутствие помех. Требуется оценить минимальную среднюю длину кодовой комбинации.
Для решения данной задачи должна быть известна вероятность Рi появления сообщения хi, которому соответствует определенное количество символов пi алфавита В. Тогда математическое ожидание количества символов из В определится следующим образом:
n cр = пiРi (средняя величина).
Этому среднему числу символов алфавита В соответствует максимальная энтропия Нтаx = nср log т. Для обеспечения передачи информации, содержащейся в сообщениях Х кодовыми комбинациями из В, должно выполняться условие H4mах ≥ Н(х), или пcр log т ≥ - Рi log Рi. В этом случае закодированное сообщение имеет избыточность пcр ≥ H(x) / log т, nmin = H(x) / log т.
Коэффициент избыточности
Кu = (Hmax – H(x)) / Hmax = (ncp – nmin) / ncp
Выпишем эти значения в виде табл. 1.8. Имеем:
Nmin = H(x) / log2 = 2,85, Ku = (2,92 - 2,85) / 2,92 = 0,024,
т.е. код практически не имеет избыточности. Видно, что среднее число двоичных символов стремится к энтропии источника сообщений.
Таблица 1.8 Пример к первой теореме Шеннона
N | Рхi | xi | Код | ni | пi- ∙ Рi | Рхi ∙ log Рхi |
0,19 | X1 | 0,38 | -4,5522 | |||
0,16 | X2 | 0,48 | -4,2301 | |||
0.16 | X3 | 0,48 | -4,2301 | |||
0,15 | X4 | 0,45 | -4,1054 | |||
0,12 | X5 | 0,36 | -3,6706 | |||
0,11 | X6 | 0,33 | - 3,5028 | |||
0,09 | X7 | 0,36 | -3,1265 | |||
0,02 | X8 | 0,08 | -3,1288 | |||
Σ=1 | Σ=2,92 | Σ=2,85 |
Вторая теорема Шеннона гласит, что при наличии помех в канале всегда можно найти такую систему кодирования, при которой сообщения будут переданы с заданной достоверностью. При наличии ограничения пропускная способность канала должна превышать производительность источника сообщений. Таким образом, вторая теорема Шеннона устанавливает принципы помехоустойчивого кодирования. Для дискретного канала с помехами теорема утверждает, что, если скорость создания сообщений меньше или равна пропускной способности канала, то существует код, обеспечивающий передачу со сколь угодно мглой частотой ошибок.
Доказательство теоремы основывается на следующих рассуждениях. Первоначально последовательность Х = {xi} кодируется символами из В так, что достигается максимальная пропускная способность (канал не имеет помех). Затем в последовательность из В длины п вводится r символов и по каналу передается новая последовательность из п + r символов. Число возможных последовательностей длины и + т больше числа возможных последовательностей длины п. Множество всех последовательностей длины п + r может быть разбито на п подмножеств, каждому из которых сопоставлена одна из последовательностей длины п. При наличии помехи на последовательность из п + r выводит ее из соответствующего подмножества с вероятностью сколь угодно малой.
Это позволяет определять на приемной стороне канала, какому подмножеству принадлежит искаженная помехами принятая последовательность длины п + r, и тем самым восстановить исходную последовательность длины п.
Эта теорема не дает конкретного метода построения кода, но указывает на пределы достижимого в создании помехоустойчивых кодов, стимулирует поиск новых путей решения этой проблемы.