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 ...

  1. Na początek należy w sekcji USES dodać moduł MATH

  2. 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;
  1. 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;
  1. 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.

3 komentarzy

może i dla ludzi prostszy, ale nie dla komputra
teraz już wiem dlaczego kody programów są tak wielkie ;)

Opis kapustki był ciekawszy :)