Opérateur bit à bit [Résolu]

Signaler
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
Hello !



J'ai demandé l'autre soir sur #Programmation comment fonctionnais le
passage de plusieurs DWORD sur le même paramètre DWORD de la fonction
(ex.: CreateWindowEx(...,WS_VISIBLE | WS_CHILD,...) ).

Je n'avais pas du tout pensé aux opératur bit à bit, en l'occurence le OU " | " ( merci à raskolinov de me l'avoir dit).

Ensuite j'ai cherché une méthode donc pour retrouver ces éléments passés avec un OU, je doit dire que je me suis limité au OU...

J'ai donc redemandé sur le chan une aide supplémentaire, en retour j'ai
eu droit à ceci : " if( dwStyle & WS_VISIBLE ) { ... }" (merci à
aadrman).

J'ai donc fais une petite fonction :

void Fonction(DWORD dwEntier,DWORD dwTest)

{

if( dwEntier & dwTest ) printf("Wouha !!!\n");

else printf("Berk !!!\n");

}

que j'ai lancé plusieurs fios de suite :

Fonction(2 | 8 , 2);

Fonction(2 | 8 , 5);

Fonction(2 | 8 , 8);

Fonction(2 | 8 , 10);

Fonction(2 | 8 , 9);

Fonction(2 | 8 , 12);



Et voilà ce que j'obtiens au lancement :

Wouha !!!

Berk !!!

Wouha !!!

Wouha !!!

Wouha !!!

Wouha !!!



Alors voilà, je me demandais quelle étape j'avais loupé ?!

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite

14 réponses

Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
1
#include <stdio.h>





unsigned const char SALU = 128; /*(10000000 en binaire)*/

unsigned const char COMMENT = 64; /*(01000000 en binaire)*/

unsigned const char SA = 32; /*(00100000 en binaire)*/

unsigned const char VA = 16; /*(00010000)*/

unsigned const char BIEN= 8; /*(00001000)*/

unsigned const char MAL = 4; /*(00000100)*/

unsigned const char BOF = 2; /*(00000010)*/

unsigned const char OUER = 1; /*(00000001)*/



void je_retrouve (unsigned char c);



int main ()

{

je_retrouve (SALU | COMMENT | SA | VA | BIEN); /*10000000 | 01000000 |
00100000 | 00010000 | 00001000 = 11111000, on transmet donc à la
fonction la variable 11111000*/

printf (" ?\n");

je_retrouve (SA | VA | MAL);/*00100000 |00010000 |00000100 = 001010100, on tranmet à la fonction le nombre 001010100*/

getch ();

return 0;

}



void je_retrouve (unsigned char c) /* Ici on effectue un et binaire pour voir si la bits que l'on veur est à 0 ou à 1*/

{

if (c & SALU)printf ("salu ");

if (c & COMMENT)printf ("comment ");

if (c & SA)printf ("sa ");

if (c & VA)printf ("va ");

if (c & BIEN)printf ("bien ");

if (c & MAL)printf ("mal ");

if (c & BOF)printf ("bof ");

if (c & OUER)printf ("ouer ");



}
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,

l'idée quand tu fais un truc du genre, c'est que les flags a
positionner ne possedent en binaire qu'un seul 1 : cela revient a
choisir des entiers qui sont des puissances de 2 (1,2,4,8,16,32, ...en
binaire 32 s'ecrit 100000, etc.)

exemple:

#define FLAG0 1

#define FLAG1 2

#define FLAG2 4

#define FLAG3 8

#define FLAG4 16



DWORD res = (FLAG1 | FLAG3);

if (res & FLAG0)


printf("flag0 positionne\n");

if (res & FLAG1)

printf("flag1 positionne\n");

if (res & FLAG2)


printf("flag2 positionne\n");

if (res & FLAG3)


printf("flag3 positionne\n");

if (res & FLAG4)


printf("flag4 positionne\n");



si tu fais (res & 5) tu obtiendras "flag0 positionne" mais ca n'est
pas "forcement" pertinent car 5 n'est pas une puissance de 2.

Avec un entier tu peux positionner jusqu'a 32 flags (un entier est codé sur 32 bits ...)

Tu pouvais aussi faire ca:

#define FLAG0 (1 << 0)

#define FLAG1 (1 << 1)

#define FLAG2 (1 << 2)

#define FLAG3 (1 << 3)

#define FLAG4 (1 << 4)



voila; bonne méditation
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tout entier différent de 0 signifie vrai, et 0 signifie faux
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
En arithmétique binaire 10 == 8 | 2, 9 == 10 | 1 donc tu vois que ce que tu obtiens est cohérent ?

C'est quoi le problème excatement ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
10=8+2=8|2
Donc c'est Wouha!!!
Si tu n'est pas a l'aise avec la base 10, met tout en décimal, et essaie de comprendre pourquoi on utilise l'opérateur &
8|2, ca te donne 1010b=10

(8|2)&5 = (1010b)&(101b)=0 (aucun bit en commun)
par contre (8|2)&10 (1010b)&(1010b) 10 != 0
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
1
oops j'ai oublier le commentaire : cette fonction retouve les mot que on lui a passée, sa repond a ta question ?
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Donc si je comprend bien (en gros), le param sera comme un registre
d'option de 32 bits dont chaque bit représente une "option"(donc un
flag)... ?

Cel dit que vérifié le if ?

if( (2 | 8) & 2 ) ==> if( 1010b & 0010b ) ==> if( 0010b )
donc que vérif le if, ou alors est ce mon résonnement qui est faux ???

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je pense que ton raisonnement est bon et que tu as compris, mais j'ai pas trop compris ta phrase 'Cel dit que vérifié le if ?'
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
dsl, je demandais tout simplement que vérifie le if puisque que en gros
ça donne if( 1010 ) ? C'est à dire, littéralement : SI 10 ALORS...

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Ah vrai dire c'étais une question bête... désolé. J'ai trouvé la
réponse tout seul après avoir posté le message (mais je n'étais plus
chez moi...).

Merci quand même.

Le CyberMonde nous offre une meilleur qualité de vie
CyberMan.inc The WebSite
Messages postés
127
Date d'inscription
mardi 23 août 2005
Statut
Membre
Dernière intervention
9 mai 2011

Cool, je me demandais comment ça marchais !!!

Mais on est quand même limité par le nombre de possibilitée entière à mettre en param.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est normal, tu peux pas coder autant de choses que tu veux avec seulement 32 bits
Messages postés
127
Date d'inscription
mardi 23 août 2005
Statut
Membre
Dernière intervention
9 mai 2011

Exact !

Pi il y a toujours possibilité de combiné plusieur entier... genre une
option qui en inclue plusieurs... reprenon l'exemple de 2 et 8 au lieu
de passé 2 et 8 on peu passé 10 qui regroupe les 2.
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
Ca revient au meme de passer 10 à la place de 2 | 8, dans la mesure ou
2 | 8 == 10. Avec | on fait des combinaisons, on construit un masque.