Советы по 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 esixor esi,esi // результат = 0mov ebx,10 // вычисление десятичного логарифмаmov ecx,8 // преобразование по формуле 10^8-1@2:
mov edx,0 // удаление разницыdiv ebx // eax - целочисленное деление на 10, edx - остаток от деления на 10add 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 beginif Value and (1 shl i)<>0 then beginResult:=Result+'1';end else beginResult:=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 beginif Copy(Value,i,1)='1' then beginResult:=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 := '';repeatremainder := 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 dowhile ( Decimal >= Arabics[i] ) dobeginDecimal := Decimal - Arabics[i];scratch := scratch + Romans[i];end;Result := scratch;end;
[000004]



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