logo
дискретная математика

40. Системы счисления - основа различных кодов

Кодирование информации о численности чего-либо привело к созданию систем счисления [36].

Десятичная система счисления – способ кодирования натуральных чисел, причем основание системы счисления проистекало от количества пальцев на руках. История знает и другие системы – двадцатеричная – по числу пальцев на руках и ногах. Римские цифры – другой, более наглядный способ. Один палец – I, пятерня – V, две пятерни – Х, пятьдесят – L, сто – С, тысяча – М. С помощью букв обозначали цифры и греки, и русские, и грузины. Индийцы и арабы придумали нуль и позиционную систему счисления.

Основной единицей кодирования информации в настоящее время является бит – один двоичный разряд, который может быть либо нулем (0), либо единицей (1). Подавляющее большинство ЭВМ используют двоичное представление информации. В начале эры компьютеров битами кодировали числа и команды. Потом оказалось, что такое кодирование пригодно для записи, хранения и переработки практически любой информации: изображений (видеоинформации), звука, музыки, фильмов и т.д.

Группы в три бита называют триадами, группы из четырех битов – тетрады. Наиболее часто сейчас говорят о байтах – группах из восьми бит. Два байта – это уже слово. Килобайт – это 210 бит – 1024 бита. Мегабайт – это 220 бит. Гигабайт – это 230 бит. Терабайт – это 240.

Двоичная система счисления.

В двоичной системе счисления основание 2: используется только два символа: 0,1. Поэтому арифметика очень простая: 0+0=0, 0+1=1, 1+0=1, 1+1=10 (0 и перенос в следующий разряд). Запись 11011,101 некоторого двоичного числа соответствует следующему десятичному числу: 1·24+ 1·23+0·22+ 1·21+ 1·20, 1·2-1+0·2-2+1·2-3=27,625.

Такое представление числа называется представлением с фиксированной запятой. Запятая фиксирована в соответствующей аппаратуре (арифметико-логическом устройстве АЛУ). Часто числа представлялись в виде дробей, поэтому как исходные данные, так и результаты решения задач должны были представляться именно так. Для этого проводили масштабирование – выбирали масштабные коэффициенты. Неправильный выбор масштабных коэффициентов мог вызвать так называемое переполнение разрядной сетки – ошибку в виде образования целой части, для которой в разрядной сетке нет места, и она теряется.

Рассмотрим, как выполняется двоичное суммирование:

Пусть необходимо сложить два двоичных числа 101 и 11:

Двоичное вычитание, например, (10-6 в десятичном коде) выглядит следующим образом:

Для выполнения такой операции необходим специальный «вычитатель», поэтому вычитание заменяют сложением числа в так называемом обратном коде, когда разряды вычитаемого инверсируют:

При этом образуется перенос 1, который необходимо сложить с промежуточным результатом 0011:

таким образом, получаем ответ 0100 (10-6=4 в десятичном коде).

Для операций в обратном коде необходим специальный сумматор с так называемым циклическим переносом, обеспечивающим сложение переноса с промежуточным результатом. Это неудобно, поэтому применяют так называемый дополнительный код, который устраняет циклический перенос. Представим десятичное число –6 в двоичном дополнительном коде (то есть, заменяем операцию 10-6 на операцию 10+ (–6), числа здесь в десятичном коде): –6 десятичное это –0110 двоичное, в обратном коде 1001, да еще прибавляем единицу (таковы правила образования дополнительного кода):

таким образом, дополнительный двоичный код десятичного числа –6 равен 1010. Здесь старший подчеркнутый разряд это знак, знаковый разряд. Тогда операция вычитания выглядит так:

перенос, возникающий в этом случае, просто отбрасывается, получаем 0100 (4 десятичное). Поэтому при аппаратной реализации вычитания может быть использован обычный сумматор.

Дополнительные коды четырехразрядных двоичных чисел показаны в табл. 65.

Таблица 65

Дополнительные коды

0000

0

0001

+ 1

0010

+ 2

0011

+ 3

0100

+ 4

0101

+ 5

0110

+ 6

0111

+ 7

1000

Не использ.

1001

- 7

1010

- 6

1011

- 5

1100

- 4

1101

- 3

1110

- 2

1111

- 1

Таким образом, в формате из четырех разрядов представимы числа в диапазоне –7+7 (23 -1).

При использовании байта с фиксированной запятой представляют целые числа в диапазоне –127+127 (27 –1).

В общем случае n бит могут кодировать 2n объектов.

Перевод чисел из десятичной в двоичную систему счисления выполняют, например, путем деления на основание системы счисления – 2, и записывают соответствующие остатки, либо подбирают соответствующие степени числа 2.

Пример. Дано десятичное число 38, ближайшая степень числа 2 – это число 32, т.е. 25, остается еще 6, ближайшая степень числа 2 – это 4, т.е. 22, остается 2, это 21. Таким образом:

0×27+0×26+1×25+0×24+0×23+1×22+1×21+0×20=100110.

Восьмеричная система счисления.

В восьмеричном коде восемь символов:

0 (000 двоичное),

1 (001 двоичное),

2 (010 двоичное),

3 (011 двоичное),

4 (100 двоичное),

5 (101 двоичное),

6 (110 двоичное),

7 (111 двоичное).

Для перевода числа из восьмеричного кода в двоичный, необходимо каждую цифру восьмеричного кода заменить на триаду (три символа) двоичного, например, 3548=11 101 1002, здесь двоичное число представлено в байтовом формате, поэтому старшая триада неполная. Наоборот, из двоичного кода в восьмеричный: 10 111 1012=2758.

Шестнадцатеричная система счисления.

В шестнадцатеричном коде шестнадцать символов:

0 (0000 двоичное),

1 (0001 двоичное),

2 (0010 двоичное),

3 (0011 двоичное),

4 (0100 двоичное),

5 (0101 двоичное),

6 (0110 двоичное),

7 (0111 двоичное),

8 (1000 двоичное),

9 (1001 двоичное),

A (1010 двоичное),

B (1011 двоичное),

C (1100 двоичное),

D (1101 двоичное),

E (1110 двоичное),

F (1111 двоичное).

Для перевода числа из двоичной системы счисления в шестнадцатеричную, необходимо заменить каждую тетраду (четыре символа) соответствующим шестнадцатеричным символом, например:

1011 11012 =BD16.

Наоборот, из шестнадцатеричного кода в двоичный:

9АEF16= 1001 1010 1110 11112.

В восьмеричном и шестнадцатеричном кодах можно строить соответствующие арифметики.

Например, в шестнадцатеричном коде: EF16+AC16=19B16 (F+C=1B, 1 переносится в следующий разряд; E+A=18, да еще +1 из предыдущего разряда =19).

В восьмеричном коде: 378+218=608.