Probleme avec AND, ET logique

Résolu
picolo5 Messages postés 31 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 18 décembre 2006 - 23 juil. 2006 à 02:05
picolo5 Messages postés 31 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 18 décembre 2006 - 25 juil. 2006 à 22:39
Salut a tous !!

J essaye de porter un code C++ vers Delphi 2005, 

Je coince avec un calcul binaire, je ne me souvient plus comment s'appelle se calcul  , je vous explique :




En C++ des constantes sont utilisées pour connaitre des etats :



OPTION1 = 1
OPTION2 = 2
OPTION3 = 4
OPTION4 = 8
OPTION5= 16
OPTION6 = 32
OPTION7 = 64
OPTION8 = 128
OPTION9 = 256
OPTION10 = 32768
OPTION11 = 65536

Grace a un code  'etat' : 65574 et l utilisation de ET Logique je determine un etat :
if (etat & OPTION1)  printf("OPTION1 Activee\n");
...

Mais en Delphi je ne voit pas comment faire un ET logique ??

J ai fait une fonction pour faire le calcul a la main mais c est pas tres joli..


heu.. HELP !


 


Merci




 

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 juil. 2006 à 02:18
if (etat & OPTION1)  printf("OPTION1 Activee\n");



Veut dire:
- Calcul de (etat & OPTION) (Application d'un masque OPTION a etat)
- Vérification du resultat (s'il vaut 0, ne pas entrez dans la boucle)

Donc en delphi je dirais:

if (etat and OPTION) <> 0then
begin
  writeln('OPTION1 Activee');
end
3
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
23 juil. 2006 à 10:29
Tout betement :




Et  = And
Ou  = Or
Ou exclusif = Xor
Non = Not

Table du "And" si çà peut t'aider à comprendre :

S = A et B

A B S
0 0 0
0 1 0
1 0 0
1 1 1

C'est comme si A était du chocolat et B de la confiture. Si je te dit Chocolat ET confiture, çà ne sera vrai que si tu prend les deux !
Si tu ne prend que du chocolat ou que de la confiture, c'est un OU pas un ET :-)

En faite la logique c'est tout con et tu l'utilise tout les jours sans meme faire de developpement, juste en causant.

@+ :-)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 juil. 2006 à 11:24
Salut,

eh oui on l'utilise tous les jours ...

Mais j'ajouterai ceci :

pour les déclarations des constantes il est préférable, à mon avis, d'utiliser le format Hex :

Const
OPTION1  = $00000001;   <---  4 possibilités par colone  1, 2, 4 où 8
OPTION2  = $00000002;          c'est ce que tu as fais au début (mais en Hex ça fonctionne pour tous)
OPTION3  = $00000004;
OPTION4  = $00000008;   <---
OPTION5  = $00000010;
OPTION6  = $00000020;
OPTION7  = $00000040;
OPTION8  = $00000080;
OPTION9  = $00000100;OPTION10 $00008000;   <--- ici on aurai pu continuer avec 200, 400, 800 mais pour coller aux nombres que OPTION11 $00010000;  tu donnes  j'ai adapté ($8000 = 32768  et $10000 = 65536)





et le petit exemple qui va bien :




procedure TForm1.Button9Click(Sender: TObject);
Var VTest : Integer;
begin
  VTest : = 65574;
  If (VTest and OPTION1) <> 0 Then Label1.Caption := 'OPTION1 Active';
  If (VTest and OPTION2) <> 0 Then Label2.Caption : = 'OPTION2 Active';
  If (VTest and OPTION3) <> 0 Then Label3.Caption := 'OPTION3 Active';
  If (VTest and OPTION4) <> 0 Then Label4.Caption : = 'OPTION4 Active';
  If (VTest and OPTION5) <> 0 Then Label5.Caption := 'OPTION5 Active';
  If (VTest and OPTION6) <> 0 Then Label6.Caption : = 'OPTION6 Active';
  If (VTest and OPTION7) <> 0 Then Label7.Caption := 'OPTION7 Active';
  If (VTest and OPTION8) <> 0 Then Label8.Caption : = 'OPTION8 Active';
  If (VTest and OPTION9) <> 0 Then Label9.Caption := 'OPTION9 Active';
  If (VTest and OPTION10) <> 0 Then Label10.Caption : = 'OPTION10 Active';
  If (VTest and OPTION11) <> 0 Then Label11.Caption := 'OPTION11 Active';
end;

Voilà c'est tout














@+
Cirec
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 juil. 2006 à 01:38
AND = .

OR  = +



________





OPTION5 = 16

16 = hx10
16 = bn00010000



________





vtest = 24
24 = hx18
24 = bn00011000





R 24 AND 16 00011000 AND 000100000 0 .0 +00 0 .0 +00 0 .0 +01 1 .1 +11 0 .0 +10 0 .0 +0 0 0 .0 +00 0 .0 +0
R .00010000 16R +00011000 24B (24 AND 16) <> 0 trueB (24 OR 16) <> 0  true

__________

vtest = 12
12 = hx0C
12 = bn00001100
R 12 AND 16 00010000 AND 000011000 0 .0 +00 0 .0 +00 0 .0 +01 0 .0 +10 1 .0 +10 1 .0 +10 0 .0 +00 0 .0 +0
R .00000000 0R +00011100 28
B (12 AND 16) <> 0 falseB (12 OR 16) <> 0  true

on pourrait dire que AND = "A > B" ou encore  "(A-B) >= 0" ou encore "(A div B) > 0"

12 > 16           = false(12 AND 16) <> 0  false (hx000F.hx0010 hx0000) (12 - 16) >0    false (-4)
(12 div 16) > 0   = false (0 / 0.75)

24 > 16           = true(24 AND 16) <> 0  true  (hx0018.hx0010 hx0010)(24 - 16) >0    true  (8)
(24 div 16) > 0   = true  (1  / 1.50)



<hr size="2" width="100%" />
Croc (click me)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
25 juil. 2006 à 11:06
AND = .
OR  = +  <= çà c'est la notation logique, n'essayez pas çà sur delphi :-)

Sinon quel tronche ce fOxy :-D ..


son explication


ressemble à un code assembleur .

A+ ;-)
0
picolo5 Messages postés 31 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 18 décembre 2006
25 juil. 2006 à 22:39
 Bonjour a tous !

Merci pour toutes ces reponses, je n ai pas encore tester mais je m en occuppe tout de suite !
0
Rejoignez-nous