|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 29, 2004 23:30:17 Товарищи! Я уже умом тронулся тут, но край как надо реализовать функцию перевода из строки в число. Проблема в том, что число в строке может быть в любом представлении и перевести надо в любую систему. Например 16 -> 10 или наоборот. Систему числа в строке можно указать параметром, желаемую систему числа на выходе тоже. Но я что-то дотупить не могу. Настрадал код, но он переводит только из 16->10, а наоборот.. лучше не видеть. Если хотите, могу показать. :) Оптимизировать лучше по размеру. |
|
|
Дата: Июн 29, 2004 23:41:55 А поэтапно религия не позволяет? 1) Перевести строку в число 2) Перевести число в нужную систему согласно переданному спецификатору. Для этого открываем Кнута. |
|
|
Дата: Июн 30, 2004 00:25:58 for (i=len-1;i>=0;i--){ num=num*inputBase+(input[i]-'0'); } len++; do{ str[i++]=num%outputBase; num/=outputBase; }while (num!=0) str[i]=0; ReverseString(str); |
|
|
Дата: Июн 30, 2004 07:35:41 volodya Так в том-то и задумка была, чтобы одновременно переводить. |
|
|
Дата: Июн 30, 2004 10:46:48 Ну вот, после пары часов медитации родился код:
str2all: ; lpBuffer,nBufBase,nNewBase
push ebx esi edi
mov edi,dword [esp+4+12]
mov ecx,dword [esp+8+12]
xor esi,esi
mov eax,esi
mov ebx,eax
@@:
inc esi
cmp byte [edi+esi],0
jne @B
dec esi
.conv:
xor eax,eax
mov al,byte [edi]
sub al,30h
push esi
cmp al,10
jl @F
sub al,7
@@:
cmp esi,0
jz @F
xor edx,edx
mul ecx
dec esi
jnz @B
@@:
pop esi
add ebx,eax
inc edi
dec esi
jns .conv
mov ecx,dword [esp+12+12]
mov eax,ebx
xor ebx,ebx
@@:
xor edx,edx
div ecx
shl ebx,4
add ebx,edx
test eax,eax
jnz @B
xor eax,eax
@@:
mov dl,bl
and dl,00001111b
shl eax,4
add al,dl
shr ebx,4
test ebx,ebx
jnz @B
pop edi esi ebx
retn 8
Сей код из любой системы исчисления переводит в любую (теоретически), при этом преобразует строковое число в числовой вариант. Вызов на сях: str2all("1356",10,16); Предлагаю попытаться это дело оптимизировать, а заодно проверить правильность. |
|
|
Дата: Июн 30, 2004 13:19:18 msvcrt.dll!strtol |
|
|
Дата: Июн 30, 2004 20:32:53 n0p Оптимизирую не вдаваясь в правильность работы твоего кода: > shr ebx,4 test ebx,ebx jnz @B shr ebx,4 jnz @B > xor esi,esi mov eax,esi mov ebx,eax xor esi,esi xor eax,eax xor ebx,ebx ;-) |
|
|
Дата: Июн 30, 2004 20:46:20 · Поправил: Asterix n0p Ещё, в процедуру ты пихаешь, судя по всему, 3-и параметра, тогда нужно поправить стек соответственно retn 0Ch cmp esi,0 jz @F test esi, esi jz @F А вобще, если вникнуть в логику, то думаю можно гораздо лучше соптимизировать, некоторые места для оптимизации сразу бросаются в глаза ;-) |
|
|
Дата: Июн 30, 2004 21:29:39 Да, с возвратом у меня там злобная ашыпка вкралась. %) |
|
|
Дата: Июл 1, 2004 09:28:43 Вот немного оптимизнутая версия:
str2all: ; lpBuffer,nBufBase,nNewBase
push ebx esi edi
mov edi,dword [esp+4+12]
mov ecx,dword [esp+8+12]
xor esi,esi
xor ebx,ebx
@@:
inc esi
cmp byte [edi+esi],0
jne @B
.conv:
xor eax,eax
mov al,byte [edi]
sub al,30h
push esi
cmp al,10
jl @F
sub al,7
@@:
dec esi
jz @F
xor edx,edx
mul ecx
jmp @B
@@:
pop esi
add ebx,eax
inc edi
dec esi
jnz .conv
mov esi,dword [esp+12+12]
mov eax,ebx
xor ebx,ebx
xor ecx,ecx
@@:
xor edx,edx
div esi
shl edx,cl
add cl,4
add ebx,edx
test eax,eax
jnz @B
mov eax,ebx
pop edi esi ebx
retn 12
Что, никому не нужно чтоли? А как же тяга к оптимизации? Я понимаю, что msvcrt юзать лучше - думать не надо, но ведь это не тема, дорогие друзья. Вы код его видели? Это же совершенно недзенская вещь! Вобщем, жду, когда хоть в ком-нибудь проснется тяга к прекрасному. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046 |