Система счисления — метод записи чисел с помощью письменных знаков, которые могут быть как числовыми, так и буквенными.
Например, двоичная система счисления представлена всего двумя знаками: 0 и 1. Соответственно, все десятичные числа представляются только с помощью цифр 0 и 1. Т.е. 0 - 0, 1 - 1, 2 - 10, 3 - 11 и т.д.
Десятичная система счисления представлена соответственно десятью знаками - 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9.
Шестнадцатеричная система счисления имеет дополнительные буквенные символы - A, B, C, D, E и F. Т.е. для обозначения десятичного 11 используется символ A, 12 - B и т.д.
Для перевода числа из десятичной системы счисления в любую другую необходимо число делить на основание (если переводите в двоичную систему, то делим на 2, если в восьмеричную - на 8 и т.д.) до тех пор, пока частное от деления не станет меньше основания.
Для примера напишем программу перевода двоичного числа в одну из систем счисления: 8, 10 или 16. Для этого сначала переведем двоичное число в десятеричную систему счисления, а полученное число уже переведем в нужную систему счисления.
Для реализации данного алгоритма нам понадобится константа, которая содержит символы для перевода числа в шестнадцатеричную систему счисления:
const simvol : string[16] = '0123456789ABCDEF';
Поскольку шестнадцатеричная система счисления содержит не только цифры, но и буквенные символы, работать с числами будем в строковом формате.
Объявим переменные:
var
cs2 : integer; // система счисления, в которую будем производить перевод (8,10 или 16)
chislo : string; // исходное число в двоичной системе счисления
Теперь напишем две подпрограммы (функции), которые будут переводить число из любой системы счисления в десятеричную и из десятеричной в любую другую
// перевод десятичного числа в любую СС
function From_10(n, r: longint): string;
var ss: String;
begin
ss := '';
repeat
ss := simvol[(n mod r) + 1] + ss;
n := n div r;
until n = 0;
From_10 := ss;
end;
// перевод числа из любой СС в десятичное
function To_10(n: string; r: longint): longint;
var m, i: longint;
begin
m := 0;
while n[1] = '0' do delete(n, 1, 1); //убираем нули спереди
for i := 1 to length(n) do
m := m * r + pos(n[i], simvol) - 1;
To_10 := m;
end;
Теперь напишем саму программу, где организуем ввод двоичного числа и выбор системы счисления, в который число надо будет перевести (для упрощения программы контроль на "дурака" делать не будем):
begin
write('Введите число в двоичной системе счисления: ');
read(chislo);
write('Выберите в какую СС перевести число: (8,10,16)-');
readln(cs2);
writeln(chislo, '(2) =', From_10(To_10(chislo, 2), cs2),'(',cs2:2,')');
end.
Для проверки работы программы возьмем готовую таблицу перевода чисел и сравним результаты:
Возьмем исходным числом в двоичной системе число 10000 (строка 16 таблицы). Переводим по очереди в другие системы счисления, получаем результаты:
Теперь возьмем числа, которые в шестнадцатеричной системе счисления имеют буквенное обозначение: