Чтение онлайн

ЖАНРЫ

Шрифт:

4005 = 0x00000FA5 = $00000FA5 <– длинное слово (longint)

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

Табл. 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–ричную систему счисления младшую цифру отделяют операцией 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.

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

Обратное преобразование

Теперь займемся обратной задачей: пусть дана строка символов, изображающая некое число в известной системе счисления; требуется преобразовать эту строку в число и напечатать в десятичной системе.

Сборка числа из десятичных цифр нами освоена. Она выполнялась умножением накопленной суммы на десять с прибавлением очередной цифры, начиная со старшей. Надо ли объяснять, что сборка в других системах выполняется точно так же? Только умножать будем не на десять, а на основание системы счисления. В следующей ниже программе сборка выполняется функцией ConvertToNumber – «преобразовать в число».

{ P_47_2 – Преобразование из других систем счисления }

function ConvertToNumber(aBase: integer; aNumber: string): integer;

var i,n, Sum : integer;

c : char;

begin

Sum:=0; { Накопитель результата }

for i:=1 to Length(aNumber) do begin

c:= Upcase(aNumber[i]);

if c in ['0'..'9']

then n:= Ord(c)-Ord('0') {0..9}

else n:= 10+Ord(c)-Ord('A'); {10..15}

Поделиться с друзьями: