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