Решение 1
///////////////////////////////////////////////////////////////////////// // преобразование 32-битного base2 в 32-битный base10 // // максимальное число = 99 999 999, возвращает -1 при большем значении // /////////////////////////////////////////////////////////////////////////
function Base10(Base2:Integer) : Integer; assembler; asm
cmp eax,100000000 // проверка максимального значения jb @1 // значение в пределах допустимого mov eax,-1 // флаг ошибки jmp @exit // выход если -1 @1:
push ebx // сохранение регистров push esi xor esi,esi // результат = 0 mov ebx,10 // вычисление десятичного логарифма mov ecx,8 // преобразование по формуле 10^8-1 @2:
mov edx,0 // удаление разницы div ebx // eax - целочисленное деление на 10, edx - остаток от деления на 10 add esi,edx // результат = результат + разность[I] ror esi,4 // перемещение разряда loop @2 // цикл для всех 8 разрядов mov eax,esi // результат функции pop esi // восстанавление регистров pop ebx @exit: end;
|
Решение 2
function IntToBin(Value: LongInt;Size: Integer): String; var
i: Integer; begin
Result:=''; for i:=Size downto 0 do begin if Value and (1 shl i)<>0 then begin Result:=Result+'1'; end else begin Result:=Result+'0'; end; end; end;
function BinToInt(Value: String): LongInt; var
i,Size: Integer; begin
Result:=0; Size:=Length(Value); for i:=Size downto 0 do begin if Copy(Value,i,1)='1' then begin Result:=Result+(1 shl i); end; end; end;
|
Решение 3
Следующая функция получает в качестве параметра Base (1..16) любую
десятичную величину и возвращает результат в виде строки, содержащей
точное значение BaseX. Вы можете использовать данный алгоритм для
преобразования арабских чисел в римские (смотри ниже).
function DecToBase( Decimal: LongInt; const Base: Byte): String; const
Symbols: String[16] = '0123456789ABCDEF'; var
scratch: String; remainder: Byte; begin
scratch := ''; repeat remainder := Decimal mod Base; scratch := Symbols[remainder + 1] + scratch; Decimal := Decimal div Base; until ( Decimal = 0 ); Result := scratch; end;
|
Передайте данной функции любую десятичную величину (1...3999), и
она возвратит строку, содержащую точное значение в римской
транскрипции.
function DecToRoman( Decimal: LongInt ): String; const
Romans: Array[1..13] of String = ( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' );
Arabics: Array[1..13] of Integer = ( 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
var
i: Integer; scratch: String; begin
scratch := ''; for i := 13 downto 1 do while ( Decimal >= Arabics[i] ) do begin Decimal := Decimal - Arabics[i]; scratch := scratch + Romans[i]; end; Result := scratch; end;
|