Registriert seit: 31. Mai 2007
129 Beiträge
|
Re: Aus Integer-Wert bestimmte Stelle extrahieren
31. Aug 2007, 14:56
Hallo,
hab gerade diesen Thread gelesen. Mit meiner Lösung ist eine superschnelle Berechnung möglich. Vielleicht braucht es ja noch jemand
Delphi-Quellcode:
function GetDecimalDigit(number,digit:Integer):ShortInt;
asm
MOV ECX, @table.Pointer[EDX*4]
CDQ
IDIV ECX
CDQ
MOV ECX, 10
IDIV ECX
MOV AL, DL
{Die folgenden 3 Zeilen können einkommentiert werden,
wenn NEGATIVE Zahlen auch unterstützt werden sollen,
so dass das Ergebnis trotzdem eine positive Zahl ist.
Also wenn z.B. GetDecimalDigit(-3210,1) = 1 sein soll,
und NICHT GetDecimalDigit(-3210,1) = -1, NUR dann die
3 folgenden Zeilen einkommentieren!
(Geschwindigkeitsverlust von ca. 12% !!) }
//CBW
//XOR AL, AH
//SUB AL, AH
RET
@table:
DD 1,10,100,1000,10000,100000
DD 1000000, 10000000, 100000000, 1000000000
end;
Zum Testen kann folgender Code verwendet werden.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:int64;i:integer;
begin
QueryPerformanceFrequency(a);
QueryPerformanceCounter(b);
for i:=1 to 10000000 do GetDecimalDigit(6543210,3);
QueryPerformanceCounter(c);
ShowMessage('10 Mio. Berechnungen benötigten: '+ IntToStr((c - b) * 1000 div a) + ' Millisekunden, '
+ 'eine Berechnung benötigte: '+ IntToStr((c - b) * 100 div a) + ' Nanosekunden.');
end;
Viele Grüße,
Mac
|
|
Zitat
|