Rotations de bits

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Rotations de bits

Message par Dr. Dri »

je sais pas faire plus simple :(

Code : Tout sélectionner

Procedure ROL(Value.l, Offset.l)
  Offset % 32
  If Offset < 0
    Offset + 32
  EndIf
  While Offset > 0
    ROL Value, 1
    Offset - 1
  Wend
  ProcedureReturn Value
EndProcedure

Procedure ROR(Value.l, Offset.l)
  Offset % 32
  If Offset < 0
    Offset + 32
  EndIf
  While Offset > 0
    ROR Value, 1
    Offset - 1
  Wend
  ProcedureReturn Value
EndProcedure

a = $0FF00000
Debug "$"+RSet(Hex(a), 8, "0")
Debug "$"+RSet(Hex(ROR(a, 8)), 8, "0")
Debug "$"+RSet(Hex(ROL(a, 8)), 8, "0")

Debug "---"
Debug "$"+RSet(Hex(ROR(a, 32)), 8, "0")
Dri
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Peux-tu essayer ça : ?

Code : Tout sélectionner

Procedure ROL(Value.l, Offset.b)
  !  MOV     eax, dword [esp]
  !  MOV     cl, byte [esp+4]
  !  ROL      eax, cl
  ProcedureReturn
EndProcedure

Procedure ROR(Value.l, Offset.b)
  !  MOV     eax, dword [esp]
  !  MOV     cl, byte [esp+4]
  !  ROR     eax, cl
  ProcedureReturn
EndProcedure
Je pense que c'est correct et optimisé. L'argument 2 doit être une constante (valeur fixe) ou une variable .b

Le registre cl est utilisé et seul autorisé pour ce type de commande.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

ah bah je le connaissais pas ce registre ^^
ca simplifie pas mal les choses c'est sûr

Dri :10:
Répondre