1. Определение кода числа системы счисления
function Kod_chisla_system(cifra: integer): char;
begin
Result:='0';
If (cifra>=0) and (cifra<=9) then
Result:=Char(48+cifra);
If (cifra>=10) and (cifra<=35) then
Result:=Char(55+cifra);
end;
где
cifra - цифра от 0 до 35.
Например, Kod_chisla_system(2) выведет '2'; Kod_chisla_system(14) выведет 'E' (в шестнадцатеричной системе счисления).
Примечание 1. Вспомогательная функция Kod_chisla_system предназначена для нижеуказанных функций.
Примечание 2. В настоящее время существуют 16-ричные системы счисления, однако автор решил пофантазировать и расширил весь латинский алфавит. Поэтому не стоит удивляться, если при вызове функции Kod_chisla_system(35) выведет 'Z'. Но может в дальнейшем "изобретут" 32-ричные системы счисления, 36-ричные и т.д.
2. Перевод целого числа из одной системы счисления в любую другую (общий случай)
function Perewod_iz_n_w_m(chislo: string; iz_n, w_m: integer): string;
var i, k, step: integer;
chislo_10: int64;
s: char;
z: -1..1;
begin
Result:='';
{ проверка основания системы счисления }
If (iz_n<2) or (iz_n>36) or (w_m<2) or (w_m>36) then
Exit;
{ проверка на отрицательные числа }
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
{ перевод в десятичное число }
step:=1;
chislo_10:=0;
For i:=Length(chislo) downto 1 do
begin
s:=chislo[i];
k:=0;
If (s>='0') and (s<='9') then
k:=StrToInt(s);
If (s>='a') and (s<='z') then
s:=UpCase(s);
If (s>='A') and (s<='Z') then
k:=Ord(s)-55;
If k>=iz_n then
Exit;
chislo_10:=chislo_10+k*step;
step:=step*iz_n;
end;
{ далее перевод в нужную систему счисления }
Repeat
i:=chislo_10 mod w_m;
Result:=kod_chisla_system(i)+Result;
chislo_10:=chislo_10 div w_m;
Until chislo_10=0;
{ корректировка ответа и знака }
If Result='' then
Result:='0';
If (z<0) and (Result<>'0') then
Result:='-'+Result;
end;
где
chislo - исходное целое число, записанное в строковом виде;
iz_n - система счисления числа chislo;
w_m - система счисления получаемого числа.
Например, Perewod_iz_n_w_m('11110', 2, 10) выведет '30'; Perewod_iz_n_w_m('1F', 16, 10) выведет '31'; Perewod_iz_n_w_m('71', 8, 16) выведет '39'; Perewod_iz_n_w_m('-z', 36, 2) выведет '-100011'.
Примечание. Функция Perewod_iz_n_w_m и другие нижеперечисленные функции позволяют переводить отрицательные числа. Если необходимо перевести только положительные числа, достаточно убрать в коде следующие строки:
z: -1..1;
...
{ проверка на отрицательные числа }
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
...
If (z<0) and (Result<>'0') then
Result:='-'+Result;
3. Перевод целого десятеричного числа в любую систему счисления
function Perewod_iz_10_w_n(chislo, w_n: int64): string;
var i: integer;
z: -1..1;
begin
Result:='';
If (w_n>36) or (w_n<2) then
Exit;
If chislo<0 then
begin
z:=-1;
chislo:=-chislo;
end else
z:=1;
Repeat
i:=chislo mod w_n;
Result:=Kod_chisla_system(i)+Result;
chislo:=chislo div w_n;
Until chislo=0;
If Result='' then
Result:='0';
If (z<0) and (Result<>'0') then
Result:='-'+Result;
end;
где
chislo - исходное целое десятеричное число;
w_n - система счисления.
Например, Perewod_iz_10_w_n(225, 2) выведет '11100001'; Perewod_iz_10_w_n(-541, 16) выведет '-21D'; самое интересное, что Perewod_iz_10_w_n(1583, 36) выведет '17Z'.
4. Перевод целого десятеричного числа в двоичную систему счисления (частный случай)
function Perewod_iz_10_w_2(chislo: int64): string;
var i: integer;
z: -1..1;
begin
Result:='';
If chislo<0 then
begin
z:=-1;
chislo:=-chislo;
end else
z:=1;
Repeat
i:=chislo mod 2;
Result:=IntToStr(i)+Result;
chislo:=chislo div 2;
Until chislo=0;
If Result='' then
Result:='0';
If (z<0) and (Result<>'0') then
Result:='-'+Result;
end;
где
chislo - исходное целое десятеричное число.
Например, Perewod_iz_10_w_2(12) выведет '1100'; Perewod_iz_10_w_2(-8) выведет '-1000'.
5. Перевод вещественного (десятичного) десятеричного числа в любую систему счисления
function Perewod_iz_10_w_nR(chislo: real; w_n, kol_wo_posle_zapyat: integer): string;
var i: integer;
z: -1..1;
begin
If chislo<0 then
begin
z:=-1;
chislo:=-chislo;
end else
z:=1;
Result:=Perewod_iz_10_w_n(Trunc(chislo), w_n)+',';
chislo:=Frac(chislo);
For i:=1 to kol_wo_posle_zapyat do
begin
chislo:=chislo*w_n;
Result:=Result+Kod_chisla_system(Trunc(chislo));
chislo:=Frac(chislo);
end;
If z<0 then
Result:='-'+Result;
end;
где
chislo - исходное вещественное (десятичное) десятеричное число;
w_n - система счисления;
kol_wo_posle_zapyat - количество цифр после запятой.
Например, Perewod_iz_10_w_nR(25.93, 8, 10) выведет '31,7341217270'; Perewod_iz_10_w_nR(-0.01, 16, 7) выведет '-0,028F5C2'.
6. Перевод целого числа любой системы счисления в десятеричное число
function Perewod_iz_n_w_10(chislo: string; iz_n: integer): int64;
var i, k: integer;
step: int64;
s: char;
z: -1..1;
begin
Result:=0;
If (iz_n<2) or (iz_n>36) then
Exit;
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
step:=1;
For i:=Length(chislo) downto 1 do
begin
s:=chislo[i];
k:=0;
If (s>='0') and (s<='9') then
k:=StrToInt(s);
If (s>='a') and (s<='z') then
s:=UpCase(s);
If (s>='A') and (s<='Z') then
k:=Ord(s)-55;
If k>=iz_n then
begin
Result:=0;
Exit;
end;
Result:=Result+k*step;
step:=step*iz_n;
end;
If z<0 then
Result:=-Result;
end;
где
chislo - исходное число любой системы счисления;
iz_n - система счисления.
Например, Perewod_iz_n_w_10('-6a7D', 16) выведет '-27261'; Perewod_iz_n_w_10('17z', 36) выведет '1583'.
7. Перевод целого двоичного числа в десятеричную систему счисления (частный случай)
function Perewod_iz_2_w_10(chislo: string): int64;
var i, k: integer;
step: int64;
s: char;
z: -1..1;
begin
Result:=0;
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
step:=1;
For i:=Length(chislo) downto 1 do
begin
s:=chislo[i];
k:=StrToInt(s);
Result:=Result+k*step;
step:=step*2;
end;
If z<0 then
Result:=-Result;
end;
где
chislo - исходное целое двоичное число.
Например, Perewod_iz_2_w_10('-1110') выведет '-14'.
8. Перевод целого двоичного числа в шестнадцатеричную систему счисления (частный случай)
function Perewod_iz_2_w_16(chislo: string): string;
const Base: array [0..15, 0..1] of string = (('0000', '0'), ('0001', '1'),
('0010', '2'), ('0011', '3'), ('0100', '4'), ('0101', '5'),
('0110', '6'), ('0111', '7'), ('1000', '8'), ('1001', '9'),
('1010', 'A'), ('1011', 'B'), ('1100', 'C'), ('1101', 'D'),
('1110', 'E'), ('1111', 'F'));
var i, j: integer;
z: -1..1;
begin
Result:='';
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
While Length(chislo) mod 4<>0 do
chislo:='0'+chislo;
For i:=1 to Length(chislo) div 4 do
For j:=Low(Base) to High(Base) do
If Base[j, 0]=Copy(chislo, (i-1)*4+1, 4) then
begin
Result:=Result+Base[j, 1];
Break;
end;
If Result='' then
Result:='0';
If (z<0) and (Result<>'0') then
Result:='-'+Result;
end;
где
chislo - исходное целое двоичное число.
Например, Perewod_iz_2_w_16('-1101') выведет '-D'.
9. Перевод целого шестнадцатеричного числа в двоичную систему счисления (частный случай)
function Perewod_iz_16_w_2(chislo: string): string;
const Base: array [0..15, 0..1] of string = (('0000', '0'), ('0001', '1'),
('0010', '2'), ('0011', '3'), ('0100', '4'), ('0101', '5'),
('0110', '6'), ('0111', '7'), ('1000', '8'), ('1001', '9'),
('1010', 'A'), ('1011', 'B'), ('1100', 'C'), ('1101', 'D'),
('1110', 'E'), ('1111', 'F'));
var i, j: integer;
z: -1..1;
c: char;
begin
Result:='';
If (chislo<>'') and (chislo[1]='-') then
begin
z:=-1;
Delete(chislo, 1, 1);
end else
z:=1;
For i:=1 to Length(chislo) do
begin
c:=chislo[i];
If (c>='a') and (c<='z') then
c:=UpCase(c);
For j:=Low(Base) to High(Base) do
If Base[j, 1]=c then
begin
Result:=Result+Base[j, 0];
Break;
end;
end;
While (Result<>'') and (Result[1]='0') do
Delete(Result, 1, 1);
If Result='' then
Result:='0';
If (z<0) and (Result<>'0') then
Result:='-'+Result;
end;
где
chislo - исходное целое шестнадцатеричное число.
Например, Perewod_iz_16_w_2('-6A') выведет '-1101010'.
|