Zamiana liczb z jednego systemu liczbowego na inny (BIN ... OCT ... DEC ... HEX)
tomidze
Piszę tę artykuł w nawiązaniu do artykułu zamieszczonego w serwisie 30-12-2002 przez .. .
Chociaż przeliczanie liczb z jednego systemu na drugi przy odrobinie wprawy nie jest czymś nadzwyczajnym, to z doświadczenia wiem, że niektórym sprawia to poważne problemy. Ponadto czymś naturalnym dla większości ludzi jest to, że przy konwersji z systemu np. binarnego (BIN) na ósemkowy (OCT), liczba przeliczana jest najpierw na system dziesiętny (DEC) - najbardziej naturalny i przyjazny system liczbowy każdego człowieka - a następnie dopiero na system ósemkowy.
Przedstawiony poniżej algorytm również bazuje w oparciu o taką logikę. Ponadto umożliwia on przeliczanie liczb zapisanych we wszystkich systemach liczbowych z zakresu 2 do 16 (chociaż nie bardzo wiem, gdzie można by zastosować tak egzotyczny dla człowieka zapis jak: trójkowy czy czwórkowy).
No to zaczynamy ...
-
Na początek należy w sekcji USES dodać moduł MATH
-
funkcja konwersji z systemu DEC na inny:
function DEC_na_XXX(value: String; system: Integer): String;
var liczba: Integer;
{=======================================}
function Zamien(licz: Integer): String;
begin
case licz of
10: Result := 'A';
11: Result := 'B';
12: Result := 'C';
13: Result := 'D';
14: Result := 'E';
15: Result := 'F';
else Result := IntToStr(licz);
end;
end;
{=======================================}
begin
if value = '' then
begin
Result := '';
Exit;
end;
Result := '';
liczba := StrToInt(value);
Repeat
Result := Zamien(liczba mod system) + Result;
liczba := liczba div system;
until liczba = 0;
end;
- funkcja konwersji z dowolnego systemu na DEC:
function XXX_na_DEC(value: String; system: Integer): String;
var i, suma, dlug: Integer;
{============================================}
function Zamien(znak: Char): Integer;
begin
if znak in ['a', 'A'] then Result := 10
else if znak in ['b', 'B'] then Result := 11
else if znak in ['c', 'C'] then Result := 12
else if znak in ['d', 'D'] then Result := 13
else if znak in ['e', 'E'] then Result := 14
else if znak in ['f', 'F'] then Result := 15
else Result := StrToInt(znak);
end;
{============================================}
begin
if value = '' then
begin
Result := '';
Exit;
end;
suma := 0;
dlug := Length(value) - 1;
for i := 0 to dlug do
suma := suma +
Zamien(value[i + 1]) * Round(IntPower(system, (dlug - i)));
Result := IntToStr(suma);
end;
- funkcja ogólna konwersji liczby z jednego systemu (XXX) na inny (YYY):
function XXX_na_YYY(value: String; z_xxx, na_yyy: Integer): String;
begin
Result := DEC_na_XXX(XXX_na_DEC(value, z_xxx), na_yyy);
end;
Jak widać liczba (value), którą chcemy konwertować do innego systemu liczbowego musi być podana w formie łańcucha. Wynik konwersji jest równiż łańcuchem.
Przykład użycia: konwersja liczby z systemu trójkowego na liczbę w systemie dwunastkowym:
Edit2.Text := XXX_na_YYY(Edit1.Text, 3, 12);
Zapoznaj się również z plikiem BinHex.zip (http://www.4programmers.net/download.php?id=723) w sekcji Download/Delphi/Kody źródłowe. W pliku tym są dwa przykładowe programiki przeznaczone do konwersji liczb oraz moduł Systemy_liczbowe.pas zawierający pełny kod źródłowy z funkcjami opisanymi pokrótce powyżej.
Zapraszam.
http://www.4programmers.net/download.php?id=589 tak też można :P
może i dla ludzi prostszy, ale nie dla komputra
teraz już wiem dlaczego kody programów są tak wielkie ;)
Opis kapustki był ciekawszy :)