Преобразование из одной системы счисления в другую
Преобразование из одной системы счисления в другую
Преобразование из одной системы счисления в другую Самый простой способ из 10-й в 16-ю: Label1.Caption:=Format('%0:x', [StrToInt(Edit1.Text)]); ************************************************** из любой в 10-ную: Код: function from_(s:string;ss:byte):longint; var q:longint; begin q:=0; for i:=1 to length(s) do begin s[i]:=char(ord(s[i]) or 32); case s[i] of '0'..'9': q:=q*ss+byte(s[i])-ord('0'); 'a'..'z': q:=q*ss+byte(s[i])-ord('a')+10; end; end; from_:=q; end; И обратно: Код: function to_(q:longint;ss:byte):string; var s:string; i:longint; begin s:=''; repeat i:=q-trunc(q/ss)*ss; if i>9 then i:=i+ord('A')-ord('9')-1; s:=chr(i+ord('0'))+s; q:=trunc(q/ss); until q=0; to_:=s; end; **************************************************************************************** { Фунция представляет число Value в Base-ричной системе счисления, Base должно находиться в пределах [1..36] и представляется 10-ю цифрами [0..9] и 26-ю буквами английского алфавита ['A'..'Z'] } function Dec2X(const Value, Base: Cardinal): string; // Функция возвращает символ, соответствующий числу в N-ричной системе function GetChar(const N: Cardinal): Char; begin if N < 10 then // для систем счисления от 1 до 10 Result := Char(N + Ord('0')) else // для систем счисления выше 10, но не больше 36 ([0..9] + ['A'..'Z']) Result := Char(N - 10 + Ord('A')); end; var V, R: Cardinal; begin Result := ''; if Base <= 1 then begin // числа можно и в системе, состоящей из одного символа, представлять ;) if Base = 1 then begin // реализуем это SetLength(Result, Value); FillChar(Result[1], Value, Ord('0')); Exit; end else // а вот других систем счисления быть не может raise EConvertError.Create('Основание системы счисления должно быть больше 0'); end else // ограничиваем представление систем счисления 10-ю цифрами и 26-ю буквами // английского алфавита if Base > 10 + (Ord('Z') + 1) - Ord('A') then raise EConvertError.Create('Основание системы счисления должно лежать в пределах от 1 до 36'); // Выполняем преобразование в нужную систему виртуальным делением в столбик V := Value; repeat R := V mod Base; V := V div Base; Result := GetChar(R) + Result; until V < 2; // 2 - минимальная база, // то есть в любом случае когда-то "V div Base" будет равно 1 if V <> 0 then Result := IntToStr(V) + Result; end;