Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

 

 

 

Глава 47

 

 

 

Системы счисления

 

 

 

 

 

 

 

var N : integer;

i : integer;

S : string;

 

 

begin

 

 

 

 

Write('S= '); Readln(S);

 

 

 

N:=0;

 

 

 

for i:=1 to Length(S) do N:= 10*N + Ord(S[i]) – Ord ('0'); Writeln(N); Readln;

end.

Разобравшись со сборкой-разборкой десятичных чисел, замахнемся теперь на процедуры, пригодные для любых систем счисления. Но прежде ознакомимся с устройством этих систем.

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

«Отец» двоичной системы Лейбниц не помышлял о великом будущем своей придумки, и на долгие годы о ней забыли. Но изобретатели компьютеров вспомнили. Все компьютеры — от первых моделей до самых современных — строятся из простейших элементов памяти — триггеров. Триггер — это электронная схема с двумя устойчивыми состояниями. Подобие триггера — комнатный выключатель, что может (если исправен) находиться в двух устойчивых состояниях: «включен» и «отключен». То есть, выключатель «помнит» состояние, в которое его привели в последний раз, и является элементом памяти.

Итак, элементы памяти с двумя состояниями — триггеры — составляют основу компьютеров (и почему их не назвали «дваггерами»?). Одно из состояний инженеры обозначили числом 0, а другое — 1. Стало быть, триггер способен «помнить» одно из этих чисел. Маловато для серьезного счета, не так ли? Тогда и вспомнили о двоичной системе Лейбница. Инженеры соединили несколько триггеров в цепочку и назвали эту «гирлянду» регистром. Каждый триггер в регистре, подобно цифрам в десятичном числе, обладает своим весом. В зависимости от позиции в регистре, вес триггера может составлять 1, 2, 4, 8 и так далее, — это степени числа 2. Например, число 12 изображается в двоичной системе так (рис. 106).

 

 

 

 

Регистр из четырех триггеров

23

22

21

20

 

 

 

 

 

12 = 1 • 8 + 1 • 4 + 0 • 2 + 0 • 1

1

1

0

0

 

 

 

 

Веса отдельных разрядов

 

 

 

 

8

4

2

1

 

Рис. 106 – Изображение числа 12 в двоичной системе

363

Глава 47

Системы счисления

Сравните эту кодировку с десятичной системой, — принцип тот же, только веса разрядов другие. Если в десятичной системе вес очередного разряда вдесятеро больше предыдущего, то в двоичной системе — вдвое. Числа, хранящиеся в триггерах (0 или 1) служат множителями этих весов. Таким образом, при достаточной длине регистра в двоичной системе можно изобразить сколь угодно большое число.

Договоримся о форме записи двоичных чисел, иначе путаницы не избежать. У программистов приняты две формы: к символам двоичного изображения добавляют либо суффикс «B» (от Binary — «двоичный»), либо маленькую двоечку. Например, число 12 в двоичной системе записывается так.

1100B

или

1100b

или

11002

А иначе эту запись можно понять как «тысяча сто» в десятичной системе.

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

Компьютеры никогда не жаловались на двоичную систему, она их вполне устраивает. Сетовать стали программисты, — уж очень громоздкой получалась запись сравнительно небольших чисел, например:

4005 = 1111101001012

А если программистам несподручно, они что-нибудь придумают. Придумка была простой: двоичную запись разбили на группы по четыре двоичных цифры в каждой — тетрады (от греческого слова Tetra — «четыре»). И каждую тетраду записали в привычной для людей десятичной системе, разделяя тетрады точками. Например, десятичное число 4005 преобразили так.

4005 = 1111101001012 à 1111.1010.01012 à 15.10.05

Тетрады могут содержать числа от 0 до 15 — всего получается 16 значений, потому систему назвали шестнадцатеричной. Со временем запись сделали ещё короче, заменив числа от 10 до 15 буквами латинского алфавита:

A=10

B=11

C=12

D=13

E=14

F=15

Тогда показанная выше запись преобразилась так: 15.10.05 à FA5

Рис. 107 показывает это наглядней.

364

Глава 47

Системы счисления

Двоичные тетрады числа

1111.1010.0101 2

1

1

1

1

 

1

0

1

0

 

0

1

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

 

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

A

 

 

 

 

 

 

 

 

5

5

Шестнадцатеричные цифры

Рис. 107 – Преобразование двоичного числа в шестнадцатеричное

Шестнадцатеричную запись можно спутать с десятичной, и даже принять за слово, поскольку в ней встречаются буквы. Потому для таких чисел учредили свои правила: шестнадцатеричная запись числа должна начинаться с цифры, а завершаться суффиксом «H» (от Hexadecimal, Hex — «шестнадцатеричный»). Значит, изобразить число FA5 правильней так:

0FA5H или 0FA5h

Применяют и другие формы записи шестнадцатеричных чисел. Так, в языке Си принята приставка «0x» (0xFA5), а в Паскале начинают с приставки «$» — это знак доллара ($FA5). В таких записях лидирующий ноль не требуется, но для лучшего восприятия указывают обычно две, четыре, либо восемь цифр (в зависимости от величины числа или разрядности данных), например:

12

=

0x0C

=

$0C

ß байт (byte)

4005

=

0x0FA5

=

$0FA5

ß слово (word)

4005

=

0x00000FA5

=

$00000FA5

ß длинное слово (longint)

 

 

 

 

 

 

Чем хороша шестнадцатеричная система? Легкостью перевода чисел в двоичную систему и обратно. После небольшой тренировки любой может сделать это в уме. При переводе в двоичную систему заменяем каждую шестнадцатеричную цифру четырьмя двоичными и «склеиваем» эти тетрады между собой. И, хотя компьютеры по-прежнему работают в двоичной системе, программисты дружно перешли на шестнадцатеричную. Вот таблица для перевода небольших чисел из одной системы в другую.

365

Глава 47

Системы счисления

 

 

Табл. 11 – Изображения чисел в различных системах счисления

 

 

 

 

 

 

 

 

 

Десятичная

Двоичная

16-ричная

Десятичная

Двоичная

16-ричная

 

0

0000

0

8

1000

8

1

0001

1

9

1001

9

2

0010

2

10

1010

A

3

0011

3

11

1011

B

4

0100

4

12

1100

C

5

0101

5

13

1101

D

6

0110

6

14

1110

E

7

0111

7

15

1111

F

Другие системы счисления

Итак, мы познакомились с тремя позиционными системами счислений: десятичной, двоичной и шестнадцатеричной. Существуют ли другие системы? Конечно! Во всех позиционных системах вес цифры определяется её положением в числе, сравните.

2048

= 2 • 103 + 0 • 102 + 4 • 101 +

8

• 100

- десятичная;

12 =

11002 = 1 • 23 + 1 • 22 + 0 • 21 + 0 • 10

- двоичная;

4000

= $FA0 = F • 162 + A • 161 +

0

• 160

- шестнадцатеричная.

Число, на котором построена система, называют её основанием. Можно выдумать столько систем счисления, сколько существует чисел, то есть, бесконечно много. Пока нам достаточно тех, что придуманы. А если с других планет прилетят существа с семью пальцами на руках? Для них, вероятно, «родной» будет семеричная система, и мы должны быть готовы к этому!

Так мы подошли к задаче по настоящему серьезной: изобразить число в некоторой системе счисления (основания систем ограничим числами от 2 до 16).

Изображение числа в заданной системе счисления

Преобразуя числа в десятичную систему, мы «отгрызали» цифры, начиная с младших разрядов, операциями деления и получения остатка. Точно так же преобразуют числа и в другие системы, только откалывают куски иного размера. Поскольку в двоичной системе есть только две цифры, то для неё младшая цифра отсекается операцией MOD 2, а старшая часть — операцией DIV 2. Для

шестнадцатеричной системы — соответственно операциями MOD 16 и DIV 16. Отсюда следует правило: для преобразования числа в N-ричную систему счисления

366

Глава 47

Системы счисления

младшую цифру отделяют операцией MOD N, а старшую часть числа — операцией

DIV N.

В программе P_47_1 функция ConvertFromNumber — «преобразовать из числа» — делает именно то, о чем сказано выше. Обратите внимание на строковую константу:

const CDigits : string = '0123456789ABCDEF';

Она служит для изящного преобразования чисел 0—15 в шестнадцатеричные цифры «0»—«F». Константы, для которых явно указан тип, называют типизированными, — это пример такой константы.

{P_47_1 – Преобразование в произвольную систему счисления }

{Функция преобразования десятичного числа в другие системы счисления } function ConvertFromNumber(aBase, aNumber : integer): string;

const CDigits : string = '0123456789ABCDEF';

var n : integer;

c : char;

S : string;

begin

 

 

S:=''; { Накопитель цифр }

 

repeat

 

 

n:= aNumber mod aBase;

{ остаток от деления на основание }

aNumber:= aNumber div aBase; { частное от деления на основание }

c:= CDigits[1+n];

{ выбираем цифру из строки }

S:= c + S;

 

{ вставляем цифру в результат }

until aNumber=0; ConvertFromNumber:= S; { готово! }

end;

var B, N : integer; { B – основание системы, N – число } begin {=== Главная программа ===}

repeat

Write('Основание системы= '); Readln(B); if B in [2..16] then begin

Write('Преобразуемое число= '); Readln(N);

Writeln(ConvertFromNumber(B, N));

end

until not (B in [2..16]); end.

Эта простая программа подарит вам счастье наблюдать знакомые десятичные числа в экзотических системах счисления, например, в троичной или пятеричной.

367

Соседние файлы в папке delphi