Opérateur bit à bit

Résolu
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 - 24 août 2005 à 17:50
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 25 août 2005 à 22:29
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

vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
24 août 2005 à 18:40
#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 ");



}
3
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
25 août 2005 à 11:01
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 août 2005 à 18:07
Tout entier différent de 0 signifie vrai, et 0 signifie faux
3
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
24 août 2005 à 18:17
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 ?
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
24 août 2005 à 18:18
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
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
24 août 2005 à 18:43
oops j'ai oublier le commentaire : cette fonction retouve les mot que on lui a passée, sa repond a ta question ?
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 août 2005 à 16:54
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 août 2005 à 17:13
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 ?'
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 août 2005 à 18:04
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
0
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 août 2005 à 18:20
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
0
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
25 août 2005 à 19:06
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 août 2005 à 19:09
C'est normal, tu peux pas coder autant de choses que tu veux avec seulement 32 bits
0
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
25 août 2005 à 19:19
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.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
25 août 2005 à 22:29
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.
0
Rejoignez-nous