Может ли кто-нибудь дать мне идею простого преобразования двоичного кода (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; |