unit CONVUNIT;
{ CONVUNIT UNIT 1.1 }{ Copyright (C) 1997 HЖkon Stordahl }{ E-mail : stordahl@usa.net }{ Homepage: http://stordahl.home.ml.org/ }interfacefunction DEC2BIN(DEC: LONGINT): string;
function BIN2DEC(BIN: string): LONGINT;
function DEC2HEX(DEC: LONGINT): string;
function HEX2DEC(HEX: string): LONGINT;
function DEC2OCT(DEC: LONGINT): string;
function OCT2DEC(OCT: string): LONGINT;
function BIN2HEX(BIN: string): string;
function HEX2BIN(HEX: string): string;
function DEC2BASEN(BASE: INTEGER; DEC: LONGINT): string;
{ This function converts numbers from decimal (Base 10 notation) to
different systems of notation. Valid systems are from Base 2 notation
to Base 36 notation }function BASEN2DEC(BASE: INTEGER; NUM: string): LONGINT;
{ This function converts numbers from different systems of notation
to decimal (Base 10 notation). Valid systems are from Base 2 notation
to Base 36 notation }implementationfunction DEC2BIN(DEC: LONGINT): string;
var
BIN: string;
I, J: LONGINT;
beginif DEC = 0 then
BIN := '0'
elsebegin
BIN := '';
I := 0;
while (1 shl (I + 1)) < = DEC do
I := I + 1;
{ (1 SHL (I + 1)) = 2^(I + 1) }for J := 0 to I dobeginif (DEC shr (I - J)) = 1 then
BIN := BIN + '1'
{ (DEC SHR (I - J)) = DEC DIV 2^(I - J) }else
BIN := BIN + '0';
DEC := DEC and ((1 shl (I - J)) - 1);
{ DEC AND ((1 SHL (I - J)) - 1) = DEC MOD 2^(I - J) }end;
end;
DEC2BIN := BIN;
end;
function BIN2DEC(BIN: string): LONGINT;
var
J: LONGINT;
Error: BOOLEAN;
DEC: LONGINT;
begin
DEC := 0;
Error := False;
for J := 1 to Length(BIN) dobeginif (BIN[J] < > '0') and (BIN[J] < > '1') then
Error := True;
if BIN[J] = '1' then
DEC := DEC + (1 shl (Length(BIN) - J));
{ (1 SHL (Length(BIN) - J)) = 2^(Length(BIN)- J) }end;
if Error then
BIN2DEC := 0
else
BIN2DEC := DEC;
end;
function DEC2HEX(DEC: LONGINT): string;
const
HEXDigts: string[16] = '0123456789ABCDEF';
var
HEX: string;
I, J: LONGINT;
beginif DEC = 0 then
HEX := '0'
elsebegin
HEX := '';
I := 0;
while (1 shl ((I + 1) * 4)) < = DEC do
I := I + 1;
{ 16^N = 2^(N * 4) }{ (1 SHL ((I + 1) * 4)) = 16^(I + 1) }for J := 0 to I dobegin
HEX := HEX + HEXDigts[(DEC shr ((I - J) * 4)) + 1];
{ (DEC SHR ((I - J) * 4)) = DEC DIV 16^(I - J) }
DEC := DEC and ((1 shl ((I - J) * 4)) - 1);
{ DEC AND ((1 SHL ((I - J) * 4)) - 1) = DEC MOD 16^(I - J) }end;
end;
DEC2HEX := HEX;
end;
function HEX2DEC(HEX: string): LONGINT;
function Digt(Ch: CHAR): BYTE;
const
HEXDigts: string[16] = '0123456789ABCDEF';
var
I: BYTE;
N: BYTE;
begin
N := 0;
for I := 1 to Length(HEXDigts) doif Ch = HEXDigts[I] then
N := I - 1;
Digt := N;
end;
const
HEXSet: setof CHAR = ['0'..'9', 'A'..'F'];
var
J: LONGINT;
Error: BOOLEAN;
DEC: LONGINT;
begin
DEC := 0;
Error := False;
for J := 1 to Length(HEX) dobeginifnot (UpCase(HEX[J]) in HEXSet) then
Error := True;
DEC := DEC + Digt(UpCase(HEX[J])) shl ((Length(HEX) - J) * 4);
{ 16^N = 2^(N * 4) }{ N SHL ((Length(HEX) - J) * 4) = N * 16^(Length(HEX) - J) }end;
if Error then
HEX2DEC := 0
else
HEX2DEC := DEC;
end;
function DEC2OCT(DEC: LONGINT): string;
const
OCTDigts: string[8] = '01234567';
var
OCT: string;
I, J: LONGINT;
beginif DEC = 0 then
OCT := '0'
elsebegin
OCT := '';
I := 0;
while (1 shl ((I + 1) * 3)) < = DEC do
I := I + 1;
{ 8^N = 2^(N * 3) }{ (1 SHL (I + 1)) = 8^(I + 1) }for J := 0 to I dobegin
OCT := OCT + OCTDigts[(DEC shr ((I - J) * 3)) + 1];
{ (DEC SHR ((I - J) * 3)) = DEC DIV 8^(I - J) }
DEC := DEC and ((1 shl ((I - J) * 3)) - 1);
{ DEC AND ((1 SHL ((I - J) * 3)) - 1) = DEC MOD 8^(I - J) }end;
end;
DEC2OCT := OCT;
end;
function OCT2DEC(OCT: string): LONGINT;
const
OCTSet: setof CHAR = ['0'..'7'];
var
J: LONGINT;
Error: BOOLEAN;
DEC: LONGINT;
begin
DEC := 0;
Error := False;
for J := 1 to Length(OCT) dobeginifnot (UpCase(OCT[J]) in OCTSet) then
Error := True;
DEC := DEC + (Ord(OCT[J]) - 48) shl ((Length(OCT) - J) * 3);
{ 8^N = 2^(N * 3) }{ N SHL ((Length(OCT) - J) * 3) = N * 8^(Length(OCT) - J) }end;
if Error then
OCT2DEC := 0
else
OCT2DEC := DEC;
end;
function BIN2HEX(BIN: string): string;
function SetHex(St: string; var Error: BOOLEAN): CHAR;
var
Ch: CHAR;
beginif St = '0000' then
Ch := '0'
elseif St = '0001' then
Ch := '1'
elseif St = '0010' then
Ch := '2'
elseif St = '0011' then
Ch := '3'
elseif St = '0100' then
Ch := '4'
elseif St = '0101' then
Ch := '5'
elseif St = '0110' then
Ch := '6'
elseif St = '0111' then
Ch := '7'
elseif St = '1000' then
Ch := '8'
elseif St = '1001' then
Ch := '9'
elseif St = '1010' then
Ch := 'A'
elseif St = '1011' then
Ch := 'B'
elseif St = '1100' then
Ch := 'C'
elseif St = '1101' then
Ch := 'D'
elseif St = '1110' then
Ch := 'E'
elseif St = '1111' then
Ch := 'F'
else
Error := True;
SetHex := Ch;
end;
var
HEX: string;
I: INTEGER;
Temp: string[4];
Error: BOOLEAN;
begin
Error := False;
if BIN = '0' then
HEX := '0'
elsebegin
Temp := '';
HEX := '';
if Length(BIN) mod 4 < > 0 thenrepeat
BIN := '0' + BIN;
until Length(BIN) mod 4 = 0;
for I := 1 to Length(BIN) dobegin
Temp := Temp + BIN[I];
if Length(Temp) = 4 thenbegin
HEX := HEX + SetHex(Temp, Error);
Temp := '';
end;
end;
end;
if Error then
BIN2HEX := '0'
else
BIN2HEX := HEX;
end;
function HEX2BIN(HEX: string): string;
var
BIN: string;
I: INTEGER;
Error: BOOLEAN;
begin
Error := False;
BIN := '';
for I := 1 to Length(HEX) docase UpCase(HEX[I]) of
'0': BIN := BIN + '0000';
'1': BIN := BIN + '0001';
'2': BIN := BIN + '0010';
'3': BIN := BIN + '0011';
'4': BIN := BIN + '0100';
'5': BIN := BIN + '0101';
'6': BIN := BIN + '0110';
'7': BIN := BIN + '0111';
'8': BIN := BIN + '1000';
'9': BIN := BIN + '1001';
'A': BIN := BIN + '1010';
'A': BIN := BIN + '1011';
'C': BIN := BIN + '1100';
'D': BIN := BIN + '1101';
'E': BIN := BIN + '1110';
'F': BIN := BIN + '1111';
else
Error := True;
end;
if Error then
HEX2BIN := '0'
else
HEX2BIN := BIN;
end;
function Potens(X, E: LONGINT): LONGINT;
var
P, I: LONGINT;
begin
P := 1;
if E = 0 then
P := 1
elsefor I := 1 to E do
P := P * X;
Potens := P;
end;
function DEC2BASEN(BASE: INTEGER; DEC: LONGINT): string;
{ This function converts numbers from decimal (Base 10 notation) to
different systems of notation. Valid systems are from Base 2 notation
to Base 36 notation }const
NUMString: string = '0123456789ABCDEFGHAIJKLMNOPQRSTUVWXYZ';
var
NUM: string;
I, J: INTEGER;
beginif (DEC = 0) or (BASE < 2) or (BASE > 36) then
NUM := '0'
elsebegin
NUM := '';
I := 0;
while Potens(BASE, I + 1) < = DEC do
I := I + 1;
for J := 0 to I dobegin
NUM := NUM + NUMString[(DEC div Potens(BASE, I - J)) + 1];
DEC := DEC mod Potens(BASE, I - J);
end;
end;
DEC2BASEN := NUM;
end;
function BASEN2DEC(BASE: INTEGER; NUM: string): LONGINT;
{ This function converts numbers from different systems of notation
to decimal (Base 10 notation). Valid systems are from Base 2 notation
to Base 36 notation }function Digt(Ch: CHAR): BYTE;
const
NUMString: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
I: BYTE;
N: BYTE;
begin
N := 0;
for I := 1 to Length(NUMString) doif Ch = NUMString[I] then
N := I - 1;
Digt := N;
end;
const
NUMSet: setof CHAR = ['0'..'9', 'A'..'Z'];
var
J: INTEGER;
Error: BOOLEAN;
DEC: LONGINT;
begin
DEC := 0;
Error := False;
if (BASE < 2) or (BASE > 36) then
Error := True;
for J := 1 to Length(NUM) dobeginif (not (UpCase(NUM[J]) in NUMSet)) or (BASE < Digt(NUM[J]) + 1) then
Error
:= True;
DEC := DEC + Digt(UpCase(NUM[J])) * Potens(BASE, Length(NUM) - J);
end;
if Error then
BASEN2DEC := 0
else
BASEN2DEC := DEC;
end;
end.
Прекрасный фрагмент кода на языке Паскаль!
Это конвертирующий модуль, который позволяет конвертировать числа между различными системами счисления, такими как десятичная (основание 10), двоичная (основание 2), шестнадцатеричная (основание 16), восьмеричная (основание 8) и основание N (где N - любое целое число от 2 до 36).
Вот разбивка кода:
Функции
Модуль содержит несколько функций, которые выполняют конверсии между системами счисления:
1. DEC2BIN: конвертирует десятичное число в двоичное
2. BIN2DEC: конвертирует двоичное число в десятичное
3. DEC2HEX: конвертирует десятичное число в шестнадцатеричное
4. HEX2DEC: конвертирует шестнадцатеричное число в десятичное
5. DEC2OCT: конвертирует десятичное число в восьмеричное
6. OCT2DEC: конвертирует восьмеричное число в десятичное
7. BIN2HEX: конвертирует двоичное число в шестнадцатеричное
8. HEX2BIN: конвертирует шестнадцатеричное число в двоичное
9. DEC2BASEN: конвертирует десятичное число в основание N (где N - любое целое число от 2 до 36)
10. BASEN2DEC: конвертирует число основания N (где N - любое целое число от 2 до 36) в десятичное
Имплементация
Каждая функция использует комбинацию циклов, условных операторов и арифметических операций для выполнения конверсии.
Например, функция DEC2BIN работает, повторно делив входное десятичное число на 2 и добавляя остаток к строке. Процесс повторяется, пока не станет 0.
Аналогично функция HEX2DEC использует цикл для перебора каждого символа в шестнадцатеричной строке, конвертируя каждый символ в соответствующее двоичное значение с помощью таблицы поиска (реализованной как массив символов).
Обработка ошибок
Модуль включает в себя основную обработку ошибок для недопустимого ввода. Например, если указать неправильное основание или если входное число содержит символы, не являющиеся цифрами, функция вернет код ошибки.
В целом, это хорошо структурированная и эффективная реализация конверсий систем счисления на языке Паскаль.
Перевод между системами исчисления: библиотека на языке Паскаль для конвертации чисел из различных систем счисления в десятичную систему или обратно.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.