Question - OPERATEUR

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Question - OPERATEUR

Message par lule »

Je ne sais pas faire une "soustraction" d'une constante sans faire de condition.

Explication par l'exemple, comment arriver au résultat de l'exemple 2 sans utiliser une condition :


Exemple 1 - Code faux

Code : Tout sélectionner


#Const1=1
#Const2=2
#Const3=4
#Const4=8
#Const5=16
#Const6=32
#Const7=64
#Const8=128
#Const9=256
#Const10=512
#Const11=1024
#Const12=2048
#Const13=4096
#Const14=8192
#Const15=16384
#Const16=32768
#Const17=65536

For i = 0 To Random(8000)
  hObject | #Const1
  hObject | #Const2
  hObject | #Const3
  hObject | #Const4
  hObject | #Const5
  hObject | #Const6
  hObject | #Const7
  hObject | #Const8
  hObject | #Const9
  hObject | #Const10
  hObject | #Const11
  hObject | #Const12
  hObject | #Const13
  hObject | #Const14
  hObject | #Const15
  hObject | #Const16
  hObject | #Const17
Next

For i = 0 To Random(8000)
  hObject - #Const1
  hObject - #Const2
  hObject - #Const3
  hObject - #Const4
  hObject - #Const5
  hObject - #Const6
  hObject - #Const7
  hObject - #Const8
  hObject - #Const9
  hObject - #Const10
  hObject - #Const11
  hObject - #Const12
  hObject - #Const13
  hObject - #Const14
  hObject - #Const15
  hObject - #Const16
  hObject - #Const17
Next

Debug hObject
Exemple 2 - Bon code mais lourd

Code : Tout sélectionner

#Const1=1
#Const2=2
#Const3=4
#Const4=8
#Const5=16
#Const6=32
#Const7=64
#Const8=128
#Const9=256
#Const10=512
#Const11=1024
#Const12=2048
#Const13=4096
#Const14=8192
#Const15=16384
#Const16=32768
#Const17=65536

For i = 0 To Random(8000)
  hObject | #Const1
  hObject | #Const2
  hObject | #Const3
  hObject | #Const4
  hObject | #Const5
  hObject | #Const6
  hObject | #Const7
  hObject | #Const8
  hObject | #Const9
  hObject | #Const10
  hObject | #Const11
  hObject | #Const12
  hObject | #Const13
  hObject | #Const14
  hObject | #Const15
  hObject | #Const16
  hObject | #Const17
Next

For i = 0 To Random(8000)
  If hObject & #Const1 : hObject - #Const1 : EndIf
  If hObject & #Const2 : hObject - #Const2 : EndIf
  If hObject & #Const3 : hObject - #Const3 : EndIf
  If hObject & #Const4 : hObject - #Const4 : EndIf
  If hObject & #Const5 : hObject - #Const5 : EndIf
  If hObject & #Const6 : hObject - #Const6 : EndIf
  If hObject & #Const7 : hObject - #Const7 : EndIf
  If hObject & #Const8 : hObject - #Const8 : EndIf
  If hObject & #Const9 : hObject - #Const9 : EndIf
  If hObject & #Const10 : hObject - #Const10 : EndIf
  If hObject & #Const11 : hObject - #Const11 : EndIf
  If hObject & #Const12 : hObject - #Const12 : EndIf
  If hObject & #Const13 : hObject - #Const13 : EndIf
  If hObject & #Const14 : hObject - #Const14 : EndIf
  If hObject & #Const15 : hObject - #Const15 : EndIf
  If hObject & #Const16 : hObject - #Const16 : EndIf
  If hObject & #Const17 : hObject - #Const17 : EndIf

Next

Debug hObject

Vous me diriez certainement que je devrais trouver la réponse dans l'aide, mais j'ai des problèmes pour lire des trucs du genre :

LHS | RHS |Résultat
------------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1


Merci.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Question - OPERATEUR

Message par TazNormand »

Salut

déjà je vois pas l'intérêt de tes boucles. Ensuite, à l'issue de ta première boucle, hObject est toujours égal à 131071, tu auras beau itérer 8000 fois, ça changera pas.

C'est quoi le but recherché ?

Ensuite, si tu exécutes tes soustractions une seule fois, donc pas de 2ème boucle, hObject sera bien égal à 0 (zéro) si c'est ça que tu attends.

EDIT :

voici les valeurs binaires de tes constantes :

Code : Tout sélectionner

[09 :47 :13] 00000000000000000000000000000001
[09 :47 :13] 00000000000000000000000000000010
[09 :47 :13] 00000000000000000000000000000100
[09 :47 :13] 00000000000000000000000000001000
[09 :47 :13] 00000000000000000000000000010000
[09 :47 :13] 00000000000000000000000000100000
[09 :47 :13] 00000000000000000000000001000000
[09 :47 :13] 00000000000000000000000010000000
[09 :47 :13] 00000000000000000000000100000000
[09 :47 :13] 00000000000000000000001000000000
[09 :47 :13] 00000000000000000000010000000000
[09 :47 :13] 00000000000000000000100000000000
[09 :47 :13] 00000000000000000001000000000000
[09 :47 :13] 00000000000000000010000000000000
[09 :47 :13] 00000000000000000100000000000000
[09 :47 :13] 00000000000000001000000000000000
[09 :47 :13] 00000000000000010000000000000000
donc quand tu fais un | c'est à dire un OU logique d'une variable non initialisée hObject, donc à zéro, tu obtiens :avec #Const1 :
00000000000000000000000000000000 OU 00000000000000000000000000000001 = 00000000000000000000000000000001
Le OU c'est au moins une es 2 valeurs doit être vraie, donc en test binaire bits à bits, 1 OU 0 égal à 1
#Const2 :
00000000000000000000000000000001 OU 00000000000000000000000000000010 = 00000000000000000000000000000011

etc...

Au final tu as une valeur égale = 00000000000000011111111111111111 en binaire, soit 131071

Ensuite, si tu soustrait x fois dans une autre boucle sans tester (exemple 1), forcément tu arrives avec un nombre négatif.

Si tu veux revenir à 0 (zéro), tu fais un OU EXCLUSIF (XOR, ! en PureBasic)

Code : Tout sélectionner

#Const1=1
#Const2=2
#Const3=4
#Const4=8
#Const5=16
#Const6=32
#Const7=64
#Const8=128
#Const9=256
#Const10=512
#Const11=1024
#Const12=2048
#Const13=4096
#Const14=8192
#Const15=16384
#Const16=32768
#Const17=65536

; on vire le "For" inutile
;For i = 0 To Random(8000)
	hObject | #Const1
	hObject | #Const2
	hObject | #Const3
	hObject | #Const4
	hObject | #Const5
	hObject | #Const6
	hObject | #Const7
	hObject | #Const8
	hObject | #Const9
	hObject | #Const10
	hObject | #Const11
	hObject | #Const12
	hObject | #Const13
	hObject | #Const14
	hObject | #Const15
	hObject | #Const16
	hObject | #Const17
;Next

; on vire le "For" inutile
;For i = 0 To Random(8000)
	hObject ! #Const1
	hObject ! #Const2
	hObject ! #Const3
	hObject ! #Const4
	hObject ! #Const5
	hObject ! #Const6
	hObject ! #Const7
	hObject ! #Const8
	hObject ! #Const9
	hObject ! #Const10
	hObject ! #Const11
	hObject ! #Const12
	hObject ! #Const13
	hObject ! #Const14
	hObject ! #Const15
	hObject ! #Const16
	hObject ! #Const17
;Next

Debug hObject
Image
Image
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Re: Question - OPERATEUR

Message par lule »

Merci, c'est la réponse que je cherchais.

ps : La boucle for servait pour l'exemple.
Répondre