Decalage et recup du signe (comment?) [RESOLU]

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Decalage et recup du signe (comment?) [RESOLU]

Message par flaith »

Hello tous,

je lisais l'aide et j'ai retenue surtout ceci

Code : Tout sélectionner

f.b=-128 >> 1 ; La valeur de 'f' sera -64. -128=%10000000, -64=%11000000. Lors du décalage, le bit le plus fort reste (conservation du signe).
comme il y a conservation du signe (CF ?), comment peut-on le récupérer ?
Dernière modification par flaith le mer. 21/mars/2007 19:25, modifié 1 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

pour récupérer le signe tu peux essayer ca :

Code : Tout sélectionner

Procedure EstNegatif(Entier.q)
  ProcedureReturn (Entier >> 63) & 1
EndProcedure

b.b = -5
w.w = -5
l.l = -5
q.q = -5

Debug EstNegatif(b)
Debug EstNegatif(w)
Debug EstNegatif(l)
Debug EstNegatif(q)
sinon on parle de propagation du signe, il y a deux façons de décaler les bits

soit en propageant le bit de poid foirt (x >> n équivaut x / 2^n)
soit sans le propager (ca propage d'office des 0)

Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Merci Dri :D (en fait ça va aussi me servir)

effectivement, je me suis mal exprimé, en fait je désire récupérer le bit qui sort lors du décalage, en asm le bit est dans CF, un peu comme ça :

Code : Tout sélectionner

test = 0

!   mov   ax, 10010100b
!   mov   word [v_test], ax
!   mov   ecx,8
!shift: 
!   shr   word [v_test], 1    ; shift right
!   jb    egal_1              ; si CF (carry flag) = 1

!   push  ecx
Debug "0"
!   pop   ecx

!   jmp   cont
!egal_1:

!   push  ecx
Debug "1"
!   pop   ecx

!cont:
!   loop  shift
y-a-t'il un autre moyen de le faire qu'en ASM ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

attention a la propagation du bit de poids fort si jamais le nombre est négatif...
pour un nombre positif tu peux faire comme ca

Code : Tout sélectionner

bin = %10010100

While bin
  Debug bin & 1
  bin >> 1
Wend
Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Merci Dri :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

compatible avec les nombres négatifs, avec un tout pitit peu d'asm

Code : Tout sélectionner

bin = %10001000100010001000100010010100

Debug bin

While bin
  Debug bin & 1
  !shr dword [v_bin], 1
Wend
Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Image
Répondre