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 {=== Главная программа ===}