hex, dezimal

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag 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 ;)
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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:
Zuletzt geändert von NicTheQuick am 01.04.2005 18:18, insgesamt 1-mal geändert.
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag von PureFan »

Thx :mrgreen: <)
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
Antworten