Повторю нашу цель: мы хотим превратить нечто цельное – число – в цепочку символов. Как это сделать? Есть мысли? Я предлагаю «откалывать» от числа цифру за цифрой, превращая их в символы и складывая в строку. Из опыта известно, что легче всего «отгрызть» от числа младшую цифру, вычисляя остаток от деления на десять, вот так:
младшая_цифра := число MOD 10
Тогда старшая часть числа отделится от младшей цифры делением на десять. При этом остаток будет отброшен, но он теперь и не нужен, поскольку сохранен в младшей цифре.
старшая_часть := число DIV 10
Так прояснилась схема дробления числа, показанная на рис. 104.
Рис.104 – Выделение отдельных цифр десятичного числа
Число дробится, пока в старшей части не окажется ноль. Осталось лишь организовать цикл, условием выхода из которого будет равенство нулю старшей части. Эта несложная программа перед вами.
var N : integer; S : string;
begin { Преобразование числа в строку десятичных цифр }
Write('N= '); Readln(N);
S:='';
repeat
S:= Char((N mod 10)+Ord('0')) + S; { выделение очередной цифры }
N:= N div 10; { отделение старшей части }
until N=0;
Writeln(S); Readln;
end.
Теперь, когда мы смогли превратить число в строку, займемся обратным превращением – соберем число из символов строки. Откуда подступиться к этой сборке? Запишем разложение числа с помощью скобок следующим образом:
2048 = 2• 1000 + 0• 100 + 4• 10 + 8• 1 = (((0 •10+ 2) •10+ 0) •10+ 4) •10+ 8
Правила действий со скобками требуют начать вычисление с внутренних, самых глубоких скобок. Следовательно, сборку числа из отдельных цифр начнем со старших разрядов, последовательно умножая накопленную сумму на 10. Внутри самых глубоких скобок добавлено слагаемое 0•10. Не влияя на результат вычислений, оно придает общность алгоритму сборки, который показан на рис. 105.
Рис.105 – Сборка числа из строки десятичных цифр
Например, для числа 2048 сборка пойдет в таком порядке:
N = 0 – исходное значение
N = 0 • 10 + 2 = 2
N = 2 • 10 + 0 = 20
N = 20 • 10 + 4 = 204
N = 204 • 10 + 8 = 2048
А вот программа, работающая по этому алгоритму.
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).
Рис.106 – Изображение числа 12 в двоичной системе
Сравните эту кодировку с десятичной системой, – принцип тот же, только веса разрядов другие. Если в десятичной системе вес очередного разряда вдесятеро больше предыдущего, то в двоичной системе – вдвое. Числа, хранящиеся в триггерах (0 или 1) служат множителями этих весов. Таким образом, при достаточной длине регистра в двоичной системе можно изобразить сколь угодно большое число.
Читать дальше