Seite 2 von 2

Verfasst: 01.04.2005 17:00
von PureFan
Hier meine Assembler-Variante, die allerdings nur bei genau 8 Zeichen langen Hex-Strings funktioniert.
Da sie ohne Jumps und String-Befehle auskommt ist sie jedoch um einiges schneller!

Code: Alles auswählen

; Autor: PureFan
; Datum: 01.04.2005
; Forum: http://forums.purebasic.com/german/viewtopic.php?t=384

Procedure PureFans_Hex2Dec(Value)
  !POP Edi
  !PUSH Edi
  !MOV Ebx,[Edi]
  !SUB Ebx,030303030h
  !MOV Eax,Ebx
  !SHR Eax,4
  !AND Eax,01010101h
  !MOV Edx,7
  !MUL Edx
  !SUB Ebx,Eax
  !AND Ebx,0F0F0F0Fh
  !SHL bl,4
  !OR bl,bh
  !ROR Ebx,16
  !SHL bl,4
  !OR bh,bl
  !SHL Ebx,8
  !XOR bx,bx
  !MOV Ecx,[Edi+4]
  !SUB Ecx,030303030h
  !MOV Eax,Ecx
  !SHR Eax,4
  !AND Eax,01010101h
  !MOV Edx,7
  !MUL Edx
  !SUB Ecx,Eax
  !AND Ecx,0F0F0F0Fh
  !SHL cl,4
  !OR cl,ch
  !ROR Ecx,16
  !SHL cl,4
  !OR ch,cl
  !SHL Ecx,8
  !XOR cx,cx
  !SHR Ecx,16
  !OR Ecx,Ebx
  !MOV Eax,Ecx
  ProcedureReturn
EndProcedure

Debug Hex(PureFans_Hex2Dec(@"abcdef01"))
Debug Hex(PureFans_Hex2Dec(@"ABCDEF01"))
Debug Hex(PureFans_Hex2Dec(@"01234567"))
Bei einem Geschwindigkeitstest mit 100.000.000 Durchläufen benötigt sie nur ca. 8 Sek, wärend die anderen Prozeduren oben z.T. bis zu 3 Minuten benötigen ;)

Verfasst: 01.04.2005 17:54
von NicTheQuick
Schick :shock:
PureFan hat geschrieben:

Code: Alles auswählen

Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T
Übrigens interessante Signatur. :allright:

Verfasst: 01.04.2005 17:57
von PureFan
Thx :mrgreen: <)