- Арифметическое кодирование
- Содержание
- Принцип действия [ править ]
- Кодирование [ править ]
- Псевдокод [ править ]
- Декодирование [ править ]
- Псевдокод [ править ]
- Пример работы [ править ]
- ГЛАВА 2. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ, АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ОПЕРАЦИИ В ВЫЧИСЛИТЕЛЬНЫХ МАШИНАХ
- 2.1. ВВЕДЕНИЕ
- 2.2. СИСТЕМЫ СЧИСЛЕНИЯ
- ИСТОРИЧЕСКИЕ СВЕДЕНИЯ
- ДЕСЯТИЧНАЯ СИСТЕМА СЧИСЛЕНИЯ
- СЧЁТ В СИСТЕМАХ СЧИСЛЕНИЯ, ОТЛИЧНЫХ ОТ ДЕСЯТИЧНОЙ
- 2.3. ДВОИЧНЫЕ ЧИСЛА
- ЗАЧЕМ НУЖНЫ ДВОИЧНЫЕ ЧИСЛА
- СЧЁТ В ДВОИЧНОЙ СИСТЕМЕ СЧИСЛЕНИЯ
- ДВОИЧНАЯ АРИФМЕТИКА
- 2.4. ПРЕОБРАЗОВАНИЕ ЧИСЕЛ
- ОСНОВНЫЕ АЛГОРИТМЫ
- ПРЕОБРАЗОВАНИЕ УМНОЖЕНИЕМ
- ПРЕОБРАЗОВАНИЕ ДЕЛЕНИЕМ
- 2.5. ШЕСТНАДЦАТЕРИЧНЫЕ ЧИСЛА
- ЕЩЁ НЕМНОГО О ПРЕДСТАВЛЕНИИ ЧИСЕЛ
- ШЕСТНАДЦАТЕРИЧНОЕ ПРЕДСТАВЛЕНИЕ ЧИСЕЛ
- СЛОЖЕНИЕ И ВЫЧИТАНИЕ ШЕСТНАДЦАТЕРИЧНЫХ ЧИСЕЛ
- УПРАЖНЕНИЯ 2.1
- 2.6. ДВОИЧНАЯ АРИФМЕТИКА В ДОПОЛНИТЕЛЬНЫХ КОДАХ
- ОСОБЕННОСТИ ПРЕДСТАВЛЕНИЯ ЧИСЕЛ В ВЫЧИСЛИТЕЛЬНЫХ МАШИНАХ
- ОТРИЦАТЕЛЬНЫЕ ЧИСЛА В ДОПОЛНИТЕЛЬНОМ КОДЕ
- 2.7. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В ЭВМ СЕМЕЙСТВА VAX
- БАЙТЫ, СЛОВА И ДЛИННЫЕ СЛОВА
- ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ЧИСЕЛ В ФОРМАТЕ БАЙТА
- ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ЧИСЕЛ В ФОРМАТЕ СЛОВА И ДЛИННОГО СЛОВА
- 2.8. БУЛЕВА ЛОГИКА
- ЛОГИЧЕСКИЕ ЗНАЧЕНИЯ И ОПЕРАЦИИ
- ПОБИТОВАЯ ОБРАБОТКА
- 2.9. ДРУГИЕ СПОСОБЫ КОДИРОВАНИЯ
- ВОСЬМЕРИЧНОЕ ПРЕДСТАВЛЕНИЕ
- ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В ОБРАТНОМ КОДЕ
- ДРУГИЕ СПОСОБЫ ПРЕДСТАВЛЕНИЯ ИНФОРМАЦИИ
- УПРАЖНЕНИЯ 2.2
Арифметическое кодирование
Определение: |
Арифметическое кодирование (англ. Arithmetic coding) — алгоритм сжатия информации без потерь, который при кодировании ставит в соответствие тексту вещественное число из отрезка [math][0; 1)[/math] . Данный метод, как и алгоритм Хаффмана, является энтропийным, то есть длина кода конкретного символа зависит от частоты встречаемости этого символа в тексте. Арифметическое кодирование показывает более высокие результаты сжатия, чем алгоритм Хаффмана, для данных с неравномерными распределениями вероятностей кодируемых символов. |
Содержание
Принцип действия [ править ]
При арифметическом кодировании каждый символ кодируется нецелым числом бит, что эффективнее кода Хаффмана (теоретически, символу [math]a[/math] с вероятностью появления [math]p(a)[/math] допустимо ставить в соответствие код длины [math]-\log_2 p(a)[/math] , следовательно, при кодировании алгоритмом Хаффмана это достигается только с вероятностями, равными обратным степеням двойки).
Кодирование [ править ]
На вход алгоритму передаются текст для кодирования и список частот встречаемости символов.
- Рассмотрим отрезок [math][0; 1)[/math] на координатной прямой.
- Поставим каждому символу текста в соответствие отрезок, длина которого равна частоте его появления.
- Считаем символ из входного потока и рассмотрим отрезок, соответствующий этому символу. Разделим этот отрезок на части, пропорциональные частотам встречаемости символов.
- Повторим пункт [math](3)[/math] до конца входного потока.
- Выберем любое число из получившегося отрезка, которое и будет результатом арифметического кодирования.
Псевдокод [ править ]
- [math]\mathtt
\,[/math] — текст, подаваемый на вход; - [math]\mathtt
\,[/math] — длина исходного текста; - [math]\mathtt
\,[/math] — мощность алфавита исходного текста; - [math]\mathtt
\,[/math] — массив символов, составляющих алфавит исходного текста; - [math]\mathtt
\,[/math] — массив вероятностей обнаружения символа в тексте; - [math]\mathtt
\,[/math] — структура, задающая подотрезок отрезка [math][0; 1)[/math] , соответствующего конкретному символу на основе частотного анализа. Имеет поля: - [math]\mathtt
\,[/math] — левая граница подотрезка; - [math]\mathtt
\,[/math] — правая граница подотрезка;
- [math]\mathtt
- [math]\mathtt
\,[/math] , [math]\mathtt \,[/math] — границы отрезка, содержащего возможный результат арифметического кодирования.
Замечание: для оптимизации размера кода можно выбрать из полученного на последнем шаге диапазона [math][left; right][/math] число, содержащее наименьшее количество знаков в двоичной записи.
Декодирование [ править ]
Алгоритм по вещественному числу восстанавливает исходный текст.
- Выберем на отрезке [math][0; 1)[/math] , разделенном на части, длины которых равны вероятностям появления символов в тексте, подотрезок, содержащий входное вещественное число. Символ, соответствующий этому подотрезку, дописываем в ответ.
- Нормируем подотрезок и вещественное число.
- Повторим пункты [math]1[/math] — [math]2[/math] до тех пор, пока не получим ответ.
Псевдокод [ править ]
- [math]\mathtt
\,[/math] — вещественное число, подаваемое на вход;
- [math]\mathtt
\,[/math] — длина восстанавливаемого текста; - [math]\mathtt
\,[/math] — мощность алфавита исходного текста; - [math]\mathtt
\,[/math] — массив символов, составляющих алфавит исходного текста; - [math]\mathtt
\,[/math] — массив вероятностей обнаружения символа в тексте; - [math]\mathtt
\,[/math] — структура, задающая подотрезок отрезка [math][0; 1)[/math] , соответствующего конкретному символу на основе частотного анализа. Имеет поля: - [math]\mathtt
\,[/math] — левая граница подотрезка; - [math]\mathtt
\,[/math] — правая граница подотрезка; - [math]\mathtt
\,[/math] — значение символа.
- [math]\mathtt
Замечание: кодировщику и декодировщику должно быть известно, когда завершать работу. Для этого можно передавать в качестве аргумента длину текста или символ конца файла, после которого процесс должен быть остановлен.
Замечание: Несмотря на преимущества арифметического кодирования, существует проблема при его практическом применении из-за несовершенства представления чисел с плавающей точкой в памяти компьютера — поскольку некоторые дробные числа не могут быть точно представлены в двоичном коде, используемом современными процессорами (например, [math]\dfrac<1><3>[/math] ), границы символов будут округлены, что может повлечь за собой неверную работу алгоритма при больших объёмах данных. В общем случае, алгоритм можно модифицировать так, чтобы результатом было дробное число. В такой реализации вероятность встречи символа представляется в виде рационального числа. Поскольку в каждой итерации будет переход из текущего отрезка в один из его [math]m[/math] подотрезков, кратных по длине [math]n[/math] , а всего итераций [math]n[/math] , в конечном результате знаменатель дроби не превысит [math]n^
Пример работы [ править ]
Рассмотрим в качестве примера строку [math]abacaba[/math] :
Источник
ГЛАВА 2. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ, АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ
ОПЕРАЦИИ В ВЫЧИСЛИТЕЛЬНЫХ МАШИНАХ
2.1. ВВЕДЕНИЕ
Вычислительные машины выполняют обработку информации под управлением программы. Существенным является способ представления информации в ЭВМ. В данной главе будет рассмотрено двоичное представление целых чисел и логических значений в памяти ЭВМ VAX. В последующих главах будет показано, как представляются символьная информация, числа с плавающей точкой и простые структуры данных, такие как массивы.
2.2. СИСТЕМЫ СЧИСЛЕНИЯ
ИСТОРИЧЕСКИЕ СВЕДЕНИЯ
На протяжении всей истории человечества было изобретено много различных способов счисления или счёта. И сегодня ещё можно встретить людей, которые используют примитивные способы счёта, например складывают камешки в мешок или делают зарубки на палочке. До сих пор существует и более сложная римская система счисления, римские цифры сейчас используются главным образом в демонстрационных целях [1] . Однако наиболее привычной для всех нас системой счисления является десятичная или арабская [2] . На рис. 2.1 показаны примеры представления чисел в различных системах.
Счёт по зарубкам на палочке
Рис. 2.1. Некоторые системы представления чисел
ДЕСЯТИЧНАЯ СИСТЕМА СЧИСЛЕНИЯ
Одним из свойств традиционных систем представления чисел является стремление сгруппировать числа по "пятёркам" и "десяткам". Это заставляет считать числа 5, 10 и кратные им, а также степени этих чисел крайне важными, обладающими чуть ли не магическими свойствами. Действительно, очень легко умножить или разделить число на 10. Выполнить ту же операцию с числами 8, 9, 11 или 12 гораздо сложнее.
На самом деле единственной причиной наличия у чисел 5 и 10 каких-либо особенных свойств является то, что основание системы счисления равно 10. Системы счисления могут иметь и другие основания. Например, в Вавилоне более 4000 лет назад использовалась система счисления с основанием 60, называемая шестидесятеричной. В какой-то степени она сохранилась и до наших дней, например: в 1 ч - 60 мин, а в 1 мин - 60 с. Употребление слов "дюжина" для обозначения числа 12 и " гросс" [3] для числа 144 является примером использования системы счисления с основанием 12. В действительности особых преимуществ в десятичной системе счисления нет. Наиболее вероятно, что начало развитию десятичной системы положил счёт на пальцах рук. Поскольку вычислительные машины не имеют рук с пятью пальцами, использование для них десятичной системы не даёт заметного преимущества. Более того, вычислительные машины работают более эффективно при применении систем счисления, отличных от десятичной.
СЧЁТ В СИСТЕМАХ СЧИСЛЕНИЯ, ОТЛИЧНЫХ ОТ ДЕСЯТИЧНОЙ
По мере рассмотрения различных систем счисления будут излагаться основы десятичной системы, т.е. как в ней осуществляются счёт, сложение, вычитание, а также как интерпретируется представление чисел. В десятичной системе числа представляются в виде строки символов, выбранных из набора, состоящего из десяти цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Счёт ведётся начиная с 0 при последовательной записи цифр от 0 до 9. Когда будет достигнуто число 9, все цифры набора окажутся использованными. Затем слева добавляется ещё одна позиция, куда помещается цифра 1, а в начальной правой позиции повторяется последовательная запись цифр начиная с 0, что позволяет получать числа 10, 11, 12 и т.д. Когда получено число 19, при продолжении счёта цифра 9 заменяется на 0, а в соседней левой позиции прибавляется 1, в результате получается число 20. Следовательно, когда справа образуется последовательность девяток, то при увеличении счёта на 1 все они заменяются на 0, при этом перенос распространяется справа налево. Таким образом, после 3999 следует 4000.
Как было отмечено в предыдущем подразделе, нет ничего сверхъестественного ни в числе 10, ни в использовании для счёта набора из десяти цифр. Предположим, что имелось бы всего шесть цифр. Такой могла бы быть сегодняшняя традиционная система счисления, будь у людей по три пальца на руке вместо пяти. Эта система называлась бы системой счисления с основанием 6.
В системе счисления с основанием 6 имеется шесть цифр: 0, 1, 2, 3, 4, 5. Счёт в этой системе ведётся фактически так же, как и в десятичной, за исключением того, что отсутствуют цифры 6, 7, 8 и 9, а возврат к 0 и перенос осуществляются по достижении цифры 5. Так, за числом 5 следует число 10, за 15 - 20, за 255 - 300. В табл. 2.1 показано, как осуществляется счёт от 0 до 36 в системе счисления с основанием 6.
Основание 10 | Основание 6 | Основание 10 | Основание 6 |
---|---|---|---|
0 | 0 | 19 | 31 |
1 | 1 | 20 | 32 |
2 | 2 | 21 | 33 |
3 | 3 | 22 | 34 |
4 | 4 | 23 | 35 |
5 | 5 | 24 | 40 |
6 | 10 | 25 | 41 |
7 | 11 | 26 | 42 |
8 | 12 | 27 | 43 |
9 | 13 | 28 | 44 |
10 | 14 | 29 | 45 |
11 | 15 | 30 | 50 |
12 | 20 | 31 | 51 |
13 | 21 | 32 | 52 |
14 | 22 | 33 | 53 |
15 | 23 | 34 | 54 |
16 | 24 | 35 | 55 |
17 | 25 | 36 | 100 |
18 | 30 |
2.3. ДВОИЧНЫЕ ЧИСЛА
ЗАЧЕМ НУЖНЫ ДВОИЧНЫЕ ЧИСЛА
В предыдущем разделе была представлена система счисления с основанием 6 для иллюстрации того, как может осуществляться счёт в системах, отличных от десятичной. Однако намного более важной, хотя и странной на вид, является система счисления с основанием 2, или двоичная система счисления.
Напомним, что используемая нами десятичная система счисления основана на примитивной практике счёта на пальцах. Другими словами, пальцы были для человека доступным техническим средством счёта. Именно потому, что пальцев - десять, десятичная система кажется человеку естественной. Использование систем счисления с основаниями 5 и 20 имеет такое же историческое происхождение.
Возникает следующий вопрос: "Какая система естественна для ЭВМ?" Ясно, что вычислительные машины не имеют пальцев, следовательно, отсутствуют предпосылки к использованию десятичной системы. То, что естественно для ЭВМ, зависит от природы процессов, которые происходят в различных узлах вычислительной машины. Анализ работы ЭВМ показывает, что каждый процесс складывается из одного или более событий, которые либо происходят, либо - нет. Если взглянуть на некоторый участок перфокарты, то можно увидеть, что на каждой позиции перфокарты либо есть пробитое отверстие, либо его нет. Существует два, и только два возможных исхода. Отверстие не может быть пробито наполовину. Событие, результатом которого может быть только один из двух возможных исходов (отверстие пробито или не пробито), называется двоичным [4] . Ниже приведено несколько примеров различных двоичных событий.
Клавиша на клавиатуре
Нажата или не нажата
Отверстие в перфокарте
Пробито или не пробито
Включён или выключен
Зажжена или погашена
Цифровой сигнал из шине
Высокий или низкий уровень напряжения
СЧЁТ В ДВОИЧНОЙ СИСТЕМЕ СЧИСЛЕНИЯ
Счёт в двоичной системе выполняется практически так же, как в десятичной или в шестеричной системах счисления, с той разницей, что в двоичной системе имеется всего две цифры: 0 и 1. Счёт, как обычно, начинается с 0. Следующим числом является 1, но дальнейший счёт без добавления позиции слева невозможен, поскольку больше нет цифр. Поэтому происходит возврат к 0 и перенос 1 на следующую позицию, в результате будет получено двоичное число 10, которое соответствует числу 2 в десятичной системе счисления. В табл. 2.2 приведено представление чисел от 0 до 32 в двоичной системе счисления.
Основание 10 | Основание 2 | Основание 10 | Основание 2 |
---|---|---|---|
0 | 0 | 17 | 10001 |
1 | 1 | 18 | 10010 |
2 | 10 | 19 | 10011 |
3 | 11 | 20 | 10100 |
4 | 100 | 21 | 10101 |
5 | 101 | 22 | 10110 |
6 | 110 | 23 | 10111 |
7 | 111 | 24 | 11000 |
8 | 1000 | 25 | 11001 |
9 | 1001 | 26 | 11010 |
10 | 1010 | 27 | 11011 |
11 | 1011 | 28 | 11100 |
12 | 1100 | 29 | 11101 |
13 | 1101 | 30 | 11110 |
14 | 1110 | 31 | 11111 |
15 | 1111 | 32 | 100000 |
16 | 10000 |
ДВОИЧНАЯ АРИФМЕТИКА
Двоичное сложение и вычитание выполняются по той же схеме, которая обычно используется в десятичной арифметике. Сначала необходимо сформулировать правило сложения двух двоичных цифр. Хотя приёмы сложения аналогичны приёмам, используемым в десятичной арифметике, легче просто запомнить следующую таблицу:
Аналогичный набор правил может быть выведен и для вычитания. На рис. 2.2 показаны некоторые простые действия с двоичными числами.
Рис. 2.2. Двоичные вычисления
Представление чисел в двоичной системе счисления может интерпретироваться таким же образом, как и представление чисел в десятичной системе. Но в отличие от десятичной в двоичной системе имеется только две цифры. 0 и 1. Значение каждой цифры числа зависит от того места, которое эта цифра занимает, и определяется умножением на соответствующую степень числа 2. Так,
что равняется 32 + 4 + 1 = 37. Отметим также, что 37 = 11 + 26, что и получено на рис. 2.2,в, Таблица степеней числа 2 представлена в конце книги.
2.4. ПРЕОБРАЗОВАНИЕ ЧИСЕЛ
ОСНОВНЫЕ АЛГОРИТМЫ
Существуют два распространённых способа преобразования чисел из одной системы счисления в другую. В одном из них используется умножение, в другом - деление. Преобразование умножением применяется для перевода чисел из какой-либо системы в систему счисления, в которой в данный момент выполняются арифметические действия. Для выполнения арифметических действий человек обычно использует десятичную систему счисления, тогда как большинство ЭВМ используют двоичную систему. Преобразование делением применяется для преобразования чисел системы, в которой в данный момент выполняются арифметические действия, в какую-либо другую систему.
ПРЕОБРАЗОВАНИЕ УМНОЖЕНИЕМ
Способ преобразования умножением основан на представлении чисел в виде суммы степеней. Например, в десятичной системе значение цифры определяется в зависимости от того, в каком разряде числа она находится, умножением соответственно на 1, 10, 100, 1000 и т.д. В двоичной системе такое умножение выполняется на степени числа 2, т.е. на 1, 2, 4, 8, 16, 32 и т.д. В общем случае в системе счисления с основанием b значения цифр, составляющих число, определяются умножением на степени числа b. Поэтому заданное в системе с основанием b число
можно представить в виде
Перепишем эту формулу так, чтобы не требовалось каждый раз выполнять операцию возведения в степень. Новая формула имеет вид
Читатель может убедиться, что эта формула эквивалентна предыдущей. Отметим, что член 0* b равен 0 и его можно было бы исключить, однако его присутствие упрощает описание алгоритма. Алгоритм выполнения вычислений по этой формуле может быть описан следующим образом:
Шаг 1. Присвоить переменной ANSWER значение 0.
Шаг 2. Начать преобразование с самой левой цифры числа.
Шаг 3. Умножить значение переменной ANSWER на b.
Шаг 4. Получить значение следующего разряда числа (очередную цифру) и сложить его с хранящимся в переменной ANSWER значением.
Шаг 5. Если в числе есть ещё цифры, вернуться на шаг 3. Иначе переменная ANSWER содержит преобразованное число.
В качестве примера рассмотрим преобразование двоичного числа 10110 в десятичное. Ниже для каждого шага алгоритма приведены оставшиеся цифры двоичного числа и значения переменной ANSWER.
Шаг | ANSWER | Оставшиеся разряды двоичного числа |
---|---|---|
1 | 0 | - |
2 | 0 | 10110 |
3 | 0 | 10110 |
4 | 1 | 0110 |
5 | 1 | 0110 |
3 | 2 | 0110 |
4 | 2 | 110 |
5 | 2 | 110 |
3 | 4 | 110 |
4 | 5 | 10 |
5 | 5 | 10 |
3 | 10 | 10 |
4 | 11 | 0 |
5 | 11 | 0 |
3 | 22 | 0 |
4 | 22 | - |
5 | 22 | Двоичное число 10110 соответствует десятичному числу 22 |
ПРЕОБРАЗОВАНИЕ ДЕЛЕНИЕМ
Способ перевода чисел из одной системы в другую с помощью деления по своему действию является обратным преобразованию, рассмотренному выше. Как известно, при делении десятичного числа на 10 остаток от деления будет равен значению цифры в самом правом разряде числа. Оставшиеся слева цифры числа образуют полученное при делении частное. Таким образом, при делении числа 3754 на 10 остаток равен 4, а частное равно 375. Этот же принцип соблюдается при делении числа в системе счисления с основанием b на число b. Остаток будет равен значению самой правой цифры числа, а частное будет представлено цифрами, оставшимися слева.
Так как частное содержит оставшиеся цифры, этот приём может повторяться, чтобы преобразовать все число. Ниже приведён алгоритм для перевода числа N в систему счисления с основанием b.
Шаг 1. Присвоить n значение N.
Шаг 2. Вычислить q (частное) и r (остаток) от деления n на b.
Шаг 3. Вывести содержимое r как очередную цифру числа в системе с основанием b (цифры располагаются справа налево).
Шаг 4. Присвоить n значение q. Если n не равно нулю, перейти на шаг 3. Иначе преобразование закончено. При использовании этого алгоритма для преобразования десятичного числа 25 в двоичное число получается следующая последовательность шагов:
Шаг | n | q | r | Вывод | Преобразованное число | |
---|---|---|---|---|---|---|
1 | 25 | |||||
2 | 25 | 12 | 1 | |||
3 | 25 | 12 | 1 | 1 | 1 | |
4 | 12 | 12 | 1 | 1 | ||
2 | 12 | 6 | 0 | 1 | ||
3 | 12 | 6 | 0 | 0 | 01 | |
4 | 6 | 6 | 0 | 01 | ||
2 | 6 | 3 | 0 | 01 | ||
3 | 6 | 3 | 0 | 0 | 001 | |
4 | 3 | 3 | 0 | 001 | ||
2 | 3 | 1 | 1 | 001 | ||
3 | 3 | 1 | 1 | 1 | 1001 | |
4 | 1 | 1 | 1 | 1001 | ||
2 | 1 | 0 | 1 | 1001 | ||
3 | 1 | 0 | 1 | 1 | 11001 | Искомое |
4 | 0 | 0 | 1 | 11001 | число равно 11001 |
Отметим, что алгоритм преобразования умножением использовался при преобразовании двоичного числа в десятичное, а алгоритм преобразования делением - для преобразования десятичного числа в двоичное. Причина такого выбора алгоритма заключается в том, что для нас естественной является десятичная арифметика. Положив это в основу общего правила, можно сказать, что при преобразовании чисел из одной системы счисления в другую выбор алгоритма зависит от того, в какой из этих двух систем выполняются арифметические действия. Если арифметические действия выполняются в той системе, в которую осуществляется преобразование, то следует выбрать алгоритм преобразования умножением, и наоборот, если арифметические действия выполняются в системе, из которой делается преобразование, то выбирают алгоритм преобразования делением. Человек, осуществляя преобразование вручную, пользуется десятичной арифметикой. Однако для ЭВМ, в частности для ЭВМ семейства VAX, естественной является двоичная арифметика. Поэтому в машинной программе следует ожидать применения алгоритма преобразования умножением для преобразования чисел из десятичной в двоичную систему и алгоритма преобразования делением для преобразования чисел из двоичной системы в десятичную, что совершенно противоположно тому, что делалось в рассмотренных выше примерах.
2.5. ШЕСТНАДЦАТЕРИЧНЫЕ ЧИСЛА
ЕЩЁ НЕМНОГО О ПРЕДСТАВЛЕНИИ ЧИСЕЛ
Можно заметить, что чем меньше основание системы счисления, тем меньше возможных значений у каждого разряда числа: 10 значений в десятичной системе, 6 - в системе с основанием 6, и 2 - в двоичной системе. Чем меньше значений может иметь каждый разряд, тем меньше информации несут разряды числа. Как следствие этого, для представления чисел в системе с основанием 6 требуется больше разрядов, чем для представления тех же чисел в десятичной системе. Например, число 10000 в системе с основанием 6 эквивалентно числу 1296 в десятичной системе. Ситуация ещё больше усложняется для двоичных чисел. Например, число 71230 в десятичной системе представляется как 10001011000111110 в двоичной системе, т.е. число разрядов двоичного представления числа более чем в 3 раза превышает число разрядов его десятичного представления. Обычно соотношение между разрядами двоичного и десятичного представления числа равно 3 1 /3.
Один двоичный разряд вмещает наименьшее возможное количество дискретной информации и носит название бит (сокращение от binary digit - двоичный разряд). Запись двоичных чисел может быть такой длинной, что человеку неудобно их использовать. Например, семизначный телефонный номер при переводе в двоичную форму будет занимать примерно 23 разряда или бита. Кто из нас способен запомнить без ошибки свой собственный телефонный номер, состоящий из цепочки двадцати трёх нулей и единиц? Даже профессиональные программисты с многолетней практикой не всегда в ладах с большими двоичными числами. Как в таком случае возможно общение с машиной?
ШЕСТНАДЦАТЕРИЧНОЕ ПРЕДСТАВЛЕНИЕ ЧИСЕЛ
Для краткой записи двоичной информации может использоваться шестнадцатеричное кодирование. При шестнадцатеричном кодировании двоичное число разбивается на группы по четыре двоичных разряда, начиная справа. Для двоичного числа 10001011000111110 такое разбиение проводится следующим образом:
Отметим, что исходное число содержит 17 битов, а число 17 не кратно 4. Поэтому, чтобы в крайней левой группе было 4 бита, необходимо слева к числу приписать три нуля, при этом значение числа не изменится.
Рассмотрим теперь каждую группу из четырёх битов как четырёхбитовое двоичное число. В четырёх битах может быть образовано 2 4 , или 16, двоичных комбинаций. Таким образом, для обозначения 16 возможных комбинаций нужен набор из 16 простых символов. Как правило, для этого используются 10 цифр десятичной системы счисления и буквы латинского алфавита от А до F. Все эти символы являются шестнадцатеричными цифрами.
Заключительная операция состоит в замене каждой группы, состоящей из четырёх двоичных цифр, эквивалентной шестнадцатеричной цифрой (рис. 2.3). Выполнение замены для приведённой двоичной последовательности в результате даёт следующее:
представление
Таким образом, 1163Е является шестнадцатеричным представлением данной двоичной последовательности.
Было бы неверно думать, что шестнадцатеричное представление - это только код, который применяется для более простого представления двоичных чисел. Шестнадцатеричное представление чисел по праву образует систему счисления, а именно систему с основанием 16. Основная трудность, связанная с представлением шестнадцатеричных чисел, да и вообще чисел в любой системе счисления с основанием, превышающим 10, заключается в необходимости использования более 10 числовых символов для обозначения цифр. В результате получаются числа, которые не похожи на числа, например 1163Е. Однако вспомним основное правило счёта: счёт осуществляется последовательным перебором всех цифр до тех пор, пока не будет достигнуто значение старшей цифры, после чего выполняется перенос единицы в следующий разряд. В шестнадцатеричной системе значением старшей цифры является десятичное число 15, оно обозначается буквой F. Поэтому в шестнадцатеричной системе за числом F следует число 10, за числом FF - 100, за числом B7CFFF - B7D000. В табл. 2.3 приведены двоичные и шестнадцатеричные числа, эквивалентные десятичным числам от 1 до 100. Обратите внимание на соответствие между двоичными и шестнадцатеричными числами.
Двоичная комбинация | Шестнадцатеричное представление |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | А |
1011 | В |
1100 | С |
1101 | D |
1110 | Е |
1111 | F |
Рис. 2.3. Шестнадцатеричное представление
Десяти- чные числа | Двоич- ные числа | Шестна- дцатери- чные числа | Десяти- чные числа | Двоич- ные числа | Шестна- дцатери- чные числа | Десяти- чные числа | Двоич- ные числа | Шестна- дцатери- чные числа | Десяти- чные числа | Двоич- ные числа | Шестна- дцатери- чные числа |
1 | 1 | 1 | 26 | 11010 | 1A | 51 | 110011 | 33 | 76 | 1001100 | 4С |
2 | 10 | 2 | 27 | 11011 | 1B | 52 | 110100 | 34 | 77 | 1001101 | 4D |
3 | 11 | 3 | 28 | 11100 | 1C | 53 | 110101 | 35 | 78 | 1001110 | 4Е |
4 | 100 | 4 | 29 | 11101 | 1D | 54 | 110110 | 36 | 79 | 1001111 | 4F |
5 | 101 | 5 | 30 | 11110 | 1E | 55 | 110111 | 37 | 80 | 1010000 | 50 |
6 | 110 | 6 | 31 | 11111 | 1F | 56 | 111000 | 38 | 81 | 1010001 | 51 |
7 | 111 | 7 | 32 | 100000 | 20 | 57 | 111001 | 39 | 82 | 1010010 | 52 |
8 | 1000 | 8 | 33 | 100001 | 21 | 58 | 111010 | 3А | 83 | 1010011 | 53 |
9 | 1001 | 9 | 34 | 100010 | 22 | 59 | 111011 | 3В | 84 | 1010100 | 54 |
10 | 1010 | А | 35 | 100011 | 23 | 60 | 111100 | 3C | 85 | 1010101 | 55 |
11 | 1011 | В | 36 | 100100 | 24 | 61 | 111101 | 3D | 86 | 1010110 | 56 |
12 | 1100 | С | 37 | 100101 | 25 | 62 | 111110 | 3Е | 87 | 1010111 | 57 |
13 | 1101 | D | 38 | 100110 | 26 | 63 | 111111 | 3F | 88 | 1011000 | 58 |
14 | 1110 | E | 39 | 100111 | 27 | 64 | 1000000 | 40 | 89 | 1011001 | 59 |
15 | 1111 | F | 40 | 101000 | 28 | 65 | 1000001 | 41 | 90 | 1011010 | 5А |
16 | 10000 | 10 | 41 | 101001 | 29 | 66 | 1000010 | 42 | 91 | 1011011 | 5В |
17 | 10001 | 11 | 42 | 101010 | 2А | 67 | 1000011 | 43 | 92 | 1011100 | 5С |
18 | 10010 | 12 | 43 | 101011 | 2В | 68 | 1000100 | 44 | 93 | 1011101 | 5D |
19 | 10011 | 13 | 44 | 101100 | 2С | 69 | 1000101 | 45 | 94 | 1011110 | 5Е |
20 | 10100 | 14 | 45 | 101101 | 2D | 70 | 1000110 | 46 | 95 | 1011111 | 5F |
21 | 10101 | 15 | 46 | 101110 | 2Е | 71 | 1000111 | 47 | 96 | 1100000 | 60 |
22 | 10110 | 16 | 47 | 101111 | 2F | 72 | 1001000 | 48 | 97 | 1100001 | 61 |
23 | 10111 | 17 | 48 | 110000 | 30 | 73 | 1001001 | 49 | 98 | 1100010 | 62 |
24 | 11000 | 18 | 49 | 110001 | 31 | 74 | 1001010 | 4А | 99 | 1100011 | 63 |
25 | 11011 | 19 | 50 | 110010 | 32 | 75 | 1001011 | 4В | 100 | 1100100 | 64 |
В языке ассемблера, в дампах памяти и файлов для упрощения записи чисел, имеющих в ЭВМ семейства VAX двоичное представление, широко используется шестнадцатеричное представление. Очевидно, что число 6ЕА7 не может быть десятичным, поэтому можно с уверенностью полагать, что для ЭВМ VAX это число является шестнадцатеричным. Но, например, число 1734 может интерпретироваться и как десятичное, и как шестнадцатеричное. Чтобы избежать недоразумений, шестнадцатеричные числа в программах на языке ассемблера ЭВМ VAX сопровождаются префиксом ^X . Числа без префикса ^X обычно рассматриваются как десятичные. В соответствии с этим далее там, где необходимо избежать разночтения, для обозначения шестнадцатеричных чисел будет применяться префикс ^X . Таким образом, если два предыдущих числа надо было обозначить как шестнадцатеричные, то их следовало бы записать как ^X 6AE7 и ^X 1734 .
СЛОЖЕНИЕ И ВЫЧИТАНИЕ ШЕСТНАДЦАТЕРИЧНЫХ ЧИСЕЛ
Во многих случаях бывает полезно сложить или вычесть шестнадцатеричные числа вручную. Одним из способов сложения является следующий: шестнадцатеричные цифры в каждом разряде переводятся в десятичные числа, выполняется сложение десятичных чисел и сумма десятичных чисел снова приводится к шестнадцатеричному виду. Рассмотрим следующий пример:
Самый правый разряд (разряд единиц) содержит ^X A и ^X 3 . Преобразуя сумму ^X A + ^X 3 в десятичную систему, получаем 10 + 3, или 13. Преобразуя число 13 обратно в шестнадцатеричную систему, находим ^X D . Эго значит, что сумма ^X A и ^X 3 равна ^X D без переноса в следующий разряд. На этом этапе сложения имеем:
В среднем разряде или в разряде "десятков" (десятичное число 16), сумма ^X 8 + ^X B , равна сумме 8 + 11 в десятичной системе, или числу 19. Преобразуя число 19 в шестнадцатеричную систему, получаем 16 + 3, или ^X 13 . Таким образом, сумма ^X 8 и ^X B равна ^X 3 с переносом в следующий старший разряд. (Перенос осуществляется всегда, когда десятичная сумма больше или равна 16.) На этом этапе сложения имеем:
Наконец, в самом левом разряде или в разряде "сотен" (десятичное число 256) сложим ^X 1 + ^X C + ^X A , что равняется сумме 1 + 12+ 10 в десятичной системе, или 23. Так как число 23 равно 16 + 7, оно равно ^X 17 или ^X 7 с переносом в следующий старший разряд. Окончательный результат сложения следующий:
Аналогично выполняется и вычитание. Вычитание чисел
начинается с самого правого разряда или разряда единиц. Разность ^X A - ^X 3 равна разности 10 - 3, или 7, в десятичной системе, что соответствует ^X 7 . (Поскольку 10 больше 3, заём из старшего разряда не требуется.) Выполнив это вычитание, получим:
В среднем разряде или в разряде "десятков" (десятичное число 16), разность ^X 8 - ^X B равна разности чисел 8 - 11 в десятичной системе. Поскольку 8 меньше 11, необходимо занять единицу (16 десятичное) из следующего старшего разряда. Таким образом, разность ^X 8 - ^X B равна результату выражения 16 + 8 - 11, или числу 13 с заёмом. В шестнадцатеричной системе это соответствует ^X D с заёмом. На этом этапе вычитания имеем
И наконец, в самом левом разряде или в разряде "сотен" (десятичное число 256) вычисляется выражение ^X C - ^X A - ^X 1 , где ^X 1 - значение заёма. Окончательный результат вычитания
Правильность вычитания можно проверить, убедившись, что сумма ^X AB3 и ^X 1D7 равна ^X C8A .
УПРАЖНЕНИЯ 2.1
- Воспользуйтесь информацией, приведённой в энциклопедиях и словарях, и опишите три известные системы счисления, отличные от римской и арабской. Сравните эти системы:
- а) по лёгкости освоения;
- б) по применимости для вычислений;
- в) по удобству представления больших чисел.
- Продолжите счёт шестнадцатеричных и двоичных чисел, представленных в табл. 2.3, до числа 200 (десятичного).
- Сложите приведённые ниже двоичные числа:
а) - Выполните вычитание двоичных чисел, используя пары чисел из п. 3.
- Преобразуйте следующие двоичные числа в десятичные:
а) - Двоичные числа из п. 5 преобразуйте в шестнадцатеричные.
- Сложите приведённые ниже шестнадцатеричные числа:
а) - Выполните вычитание шестнадцатеричных чисел, используя пары чисел из п. 7.
- Преобразуйте следующие шестнадцатеричные числа в десятичные:
а) Преобразуйте следующие десятичные числа в двоичные:
а) - Преобразуйте десятичные числа из п. 10 в шестнадцатеричные. Используйте в ответах обозначение ^X .
- * Покажите, как выполняется счёт от 1 до числа, эквивалентного десятичному числу 200 в системе счисления с основанием 7. Как в этой системе можно отличить чётные числа от нечётных? Действует ли здесь такое же простое правило, как в десятичной системе?
2.6. ДВОИЧНАЯ АРИФМЕТИКА В ДОПОЛНИТЕЛЬНЫХ КОДАХ
ОСОБЕННОСТИ ПРЕДСТАВЛЕНИЯ ЧИСЕЛ В ВЫЧИСЛИТЕЛЬНЫХ МАШИНАХ
До сих пор при изложении материала предполагалось, что на длину чисел не накладывается никаких ограничений. Однако в вычислительных машинах арифметические операции в основном выполняются с помощью устройств, называемых регистрами. Регистр - это устройство, в котором содержится представление числа. Наглядным примером регистра может служить автомобильный одометр - счётчик пройденного расстояния. Шкала счётчика составлена из колёсиков с нанесёнными по окружности цифрами. При вращении колёсиков на шкале может быть отображено любое число в диапазоне 0 - 99999, в данном случае расстояние, выраженное в милях. Важно отметить наличие фиксированной верхней границы диапазона представляемых чисел. В вычислительных машинах большинство регистров состоят из строго определённого числа запоминающих элементов, и поэтому имеется фиксированная верхняя граница диапазона, зависящая от длины числа, которое может быть представлено в регистре. Например, в ЭВМ семейства VAX большинство операций ограничивается действиями, выполняемыми над числами длиной 8, 16 или 32 двоичных разрядов (битов). Из-за таких ограничений могут быть получены странные результаты, например когда одометр старого автомобиля, прошедшего более 100 тыс. миль, показывает небольшое расстояние.
Рис. 2.4. Пятибитовые числа без знака
Рис. 2.5. Сложение в пятиразрядном регистре
В качестве примера рассмотрим небольшую вычислительную машину с пятиразрядными двоичными регистрами. В пяти разрядах можно составить 2 5 , или 32, двоичные комбинации. Поэтому такой регистр можно использовать для счёта от 0 до 31 в десятичной системе или от 00000 до 11111 - в двоичной. Так как в счёте участвуют только положительные целые числа, то такая интерпретация содержимого регистра называется беззнаковой, а такие числа называются числами без знака. Любая попытка использовать в счёте числа больше 31 приведёт к циклическому обращению содержимого регистра в 0 и снова к отсчёту с нуля, что даст неверный результат, как в случае с одометром автомобиля, прошедшего более 99999 миль. Эта ошибка называется переполнением числа без знака. На рис. 2.4 показаны все 32 5-битовых числа и их беззнаковая десятичная интерпретация.
Однако на самом деле оказывается, что свойство переполнения может быть использовано для представления отрицательных целых чисел. Рассмотрим опять ЭВМ с пятиразрядными двоичными регистрами. Посмотрим, что произойдёт при сложении двоичного числа 11101 (десятичное число 29) с различными числами, такими как 7, 8 и 9. Сложение этих чисел в двоичной системе показано на рис. 2.5. Обратите внимание на то, что, так как мы ограничены использованием пяти разрядных двоичных регистров, при каждом сложении в ответе теряется разряд переноса.
ОТРИЦАТЕЛЬНЫЕ ЧИСЛА В ДОПОЛНИТЕЛЬНОМ КОДЕ
Исследуя результаты сложения, представленные на рис. 2.5, можно видеть, что при сложении двоичного числа 11101 с двоичным представлением любого из чисел 7, 8 или 9 полученная сумма меньше каждого второго слагаемого на 3, как если бы выполнялось вычитание числа 3. То же самое наблюдается в примерах с другими числами. В итоге при работе с 5-битовыми числами двоичное число 11101 можно рассматривать как десятичное число -3. Аналогично двоичное число 11111 при сложении подобно десятичному числу -1, двоичное 11110 - десятичному числу -2, и т.д.
Такой способ представления чисел со знаком называется системой представления чисел в двоичном дополнительном коде или поразрядным дополнением до двух. Название "дополнение до двух" дано по той причине, что отрицательное число получается при вычитании заданного числа из числа, которое является степенью основания системы счисления (2) и не помещается в разрядной сетке регистра. Например,
Другой способ вычисления дополнительного кода числа состоит в замене всех нулей в двоичном представлении числа на единицы, а единиц на нули, после чего к числу прибавляется 1. Например,
На рис. 2.6 приведены все 32 возможных 5-битовых числа и их десятичная интерпретация как чисел со знаком. Самый левый разряд используется для обозначения знака числа: 1 обозначает отрицательные, а 0 - положительные числа. Это означает, что числа, подобные 11101, которые можно интерпретировать как большие числа без знака, на самом деле являются отрицательными числами в дополнительном коде. Из рис. 2.6 видно, что в пяти битах возможно представить в дополнительном коде отрицательные числа от -1 до -16 и положительные числа от 0 до 15. Заметьте, что имеется двоичное представление числа -16, но нет представления числа +16. Отсутствие симметрии обусловлено тем, что представление числа 0 относится к положительным числам. Любая попытка породить число меньше -16 или больше +15 в таком представлении приводит к ошибке, называемой переполнением числа со знаком.
Рис. 2.6. Пятибитовые числа в дополнительном коде
Важно понять, что при выполнении арифметических операций над числами и со знаком и без знака действуют одни и те же правила сложения. Различие заключается в интерпретации числа. Например, рассмотрим следующее сложение:
При интерпретации этих чисел как чисел без знака сложение эквивалентно сложению десятичных чисел 24 + 5 = 29. При сложении их как чисел со знаком эквивалентным является -8 + 5 = -3.
2.7. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В ЭВМ СЕМЕЙСТВА VAX
БАЙТЫ, СЛОВА И ДЛИННЫЕ СЛОВА
Как отмечалось выше, большинство операций в ЭВМ семейства VAX выполняются над группами из 8, 16 или 32 двоичных разрядов (или битов). Группа из 8 битов называется байтом (byte), группа из 16 битов - словом (word), а группа из 32 битов - длинным словом (longword).
Информация, содержащаяся в байте, может быть представлена непосредственно в виде 8 двоичных цифр, например
Однако обычно информация в байте представляется в виде двух шестнадцатеричных цифр. Содержимое рассмотренного выше байта в шестнадцатеричном виде представляется так:
Обратите внимание, что двоичное и шестнадцатеричное представления информации, содержащейся в байте, являются всего лишь различными способами её представления. На самом деле в ЭВМ байт представляется в двоичном виде. Для человека удобным является шестнадцатеричное представление.
В действительности слово "байт", обозначающее небольшое количество (кусочек) битов возникло в конце 50-х годов как каламбур. В слове bite (кусок) вторая буква была заменена на у, поскольку легко спутать слова bit и bite в печатном виде. Продолжая каламбур, группу из четырёх битов (полубайт) иногда называют словом nibble (огрызок) или даже nybble.
В восьми битах можно составить только 2 8 , или 256, двоичных комбинаций. Если 8-битовый байт используется для представления числа без знака, то возможно представить целые числа только от 0 до 255 (десятичные числа). Диапазон представления чисел со знаком ограничен от -128 до +127.
Чтобы избежать подобных ограничений, в ЭВМ семейства VAX для хранения большего количества информации используется 2, 4, 8 или даже 16 байтов. В ЭВМ семейства VAX информация, содержащаяся в двух байтах, называется словом. Так как каждый байт состоит из 8 битов (две шестнадцатеричные цифры), то слово состоит из 16 битов (четыре шестнадцатеричные цифры) информации. Число ^X 1A2B в двоичном виде можно представить так:
Следующей, более крупной единицей информации является длинное слово, состоящее из двух слов, или четырёх байтов. Так как содержимое каждого байта (8 битов) может быть представлено двумя шестнадцатеричными цифрами, то содержимое длинного слова (32 бита) представляется как 8 шестнадцатеричных цифр. Длинное слово ^X 1A2B3C4D можно представить в двоичном виде так:
Ещё более крупными единицами информации являются квадраслово и октаслово. В соответствии со своим названием квадраслово состоит из четырёх слов, или 8 байтов. Квадраслово представляется 16 шестнадцатеричными цифрами (64 бита). Октаслово состоит из восьми слов, или 16 байтов (128 битов), а его содержимое может быть представлено 32 шестнадцатеричными цифрами. В данной книге чаще всего будут использоваться такие единицы информации, как байт и длинное слово. В табл. 2.4 приведены различные единицы информации, используемые в ЭВМ семейства VAX.
Почти на всех современных вычислительных машинах понятие "байт" служит для обозначения 8 битов информации. Однако количество битов в слове зависит от производителя и конкретной модели ЭВМ. Например, в ЭВМ DECsystem10 и DECSYSTEM20 слово составляют 36 битов информации, тогда как в больших ЭВМ фирмы IBM, как правило, слово - это 32 бита информации. Для совместимости ЭВМ семейства VAX с появившимся ранее семейством ЭВМ PDP-11, описанными гл. 1, длина слова была определена как 16 битов.
Двоичный код | Шестнадцатеричный код | ||||||
---|---|---|---|---|---|---|---|
Шестнадцатеричное представление | Интерпретация как число без знака | Интерпретация как число со знаком | ||
---|---|---|---|---|
Байт | Слово | Длинное слово |
---|---|---|
Нуль |
а) |
Для некоторых из этих чисел при преобразовании основания системы счисления должен быть использован алгоритм преобразования умножением, описанный в гл. 2:
Источник