Советы по Delphi

         

Преобразование двоичного числа в десятичное


Может ли кто-нибудь дать мне идею простого преобразования двоичного кода (base2) в десятичный (base10)?

Решение 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;
[000004]



Содержание раздела