Bitoperator

Contenu du snippet

Ce code permet de comprendre les différentes manipulations bit à bit que permet le C à travers l'utilisation de la méthode des masques.
J'ai choisi comme contexte la création d'un "code identifiant" personnel qui contiendrai des infos au niveau du bit.
Le code en lui même est didactique et ne vise pas à un "vrai" utilisation, bien que la méthode utilisée, les masques binaires, soit très répandue.
Feedback bienvenus!

(La présentation du code a souffert du cadre trop étroit proposé par le site.
Désolé, ce n'est pas de mon fait!)

Source / Exemple :


/*-----------------------------------------------*\
 |        SmartID, Francois Gauthier, 2009         |
 |                                                 |
 |          Identification Construction            |
 |         and Control using mask technic          |
 |                                                 |
 \*-----------------------------------------------*/
/*
   The source code of SmartID show the build up of an ID code number containing byte-level informations. 
   It then verify its validity with the False_ID Checker and the Logic Checker. 

  • /
#include <stdio.h> #include <stdlib.h> #define ARRAYSIZE 14*(sizeof(char)) struct ID { char user[2*ARRAYSIZE]; unsigned long type; } ID; typedef enum { FLAG_FALSE_ID0 = 1<<0, HOMME = 1<<1, FLAG_FALSE_ID1 = 1<<2, FEMME = 1<<3, FLAG_FALSE_ID2 = 1<<4, FLAG_FALSE_ID3 = 1<<5, EMPLOYE_ADMINISTRATIF = 1<<6, FLAG_FALSE_ID4 = 1<<7, SERVICE_SECURITE = 1<<8, FLAG_FALSE_ID5 = 1<<9, CADRE = 1<<10, FLAG_FALSE_ID6 = 1<<11, DIRECTEUR = 1<<12, FLAG_FALSE_ID7 = 1<<13, FLAG_FALSE_ID8 = 1<<14, FLAG_FALSE_ID9 = 1<<15, YEUX_BLEUS = 1<<16, YEUX_MARRONS = 1<<17, FLAG_FALSE_ID10 = 1<<18, YEUX_VERTS = 1<<19, YEUX_NOIRS = 1<<20, FLAG_FALSE_ID11 = 1<<21, FLAG_FALSE_ID12 = 1<<22, TAILLE_1M30_A_1M70 = 1<<23, FLAG_FALSE_ID13 = 1<<24, TAILLE_1M71_A_2M = 1<<25, FLAG_FALSE_ID14 = 1<<26, ASPECT_MINCE = 1<<27, ASPECT_FORT = 1<<28, FLAG_FALSE_ID15 = 1<<29 } CRITERES; int main (int argc, const char * argv[]) { unsigned long i=0, walkingOne=FLAG_FALSE_ID0, construcType=0, error=0; char z; char *option[]={"un homme", "une femme","un employe administratif", "un employe service securite", "un cadre", "un directeur","aux yeux bleus", "aux yeux marrons", "aux yeux verts", "aux yeux noirs", "de taille 1M30 &#8730;&#8224; 1M70", "de taille 1M71 a + de 2M", "d'aspect mince", "d'aspect fort"}; puts("Entrez votre Nom:"); scanf("%s", &ID.user); getchar(); puts("Crit&#8730;®res d'identification:"); while(i<=ARRAYSIZE) { while(walkingOne==FLAG_FALSE_ID0 || walkingOne==FLAG_FALSE_ID1 || walkingOne==FLAG_FALSE_ID2 || walkingOne==FLAG_FALSE_ID3 || walkingOne==FLAG_FALSE_ID4 || walkingOne==FLAG_FALSE_ID10 || walkingOne==FLAG_FALSE_ID11 || walkingOne==FLAG_FALSE_ID12 || walkingOne==FLAG_FALSE_ID13 || walkingOne==FLAG_FALSE_ID5 || walkingOne==FLAG_FALSE_ID6 || walkingOne==FLAG_FALSE_ID7 || walkingOne==FLAG_FALSE_ID8 || walkingOne==FLAG_FALSE_ID9 || walkingOne==FLAG_FALSE_ID14 || walkingOne==FLAG_FALSE_ID15) { if(walkingOne==FLAG_FALSE_ID0 || walkingOne==FLAG_FALSE_ID1 || walkingOne==FLAG_FALSE_ID2 || walkingOne==FLAG_FALSE_ID3 || walkingOne==FLAG_FALSE_ID4 || walkingOne==FLAG_FALSE_ID10 || walkingOne==FLAG_FALSE_ID11 || walkingOne==FLAG_FALSE_ID12 || walkingOne==FLAG_FALSE_ID13) { walkingOne*=2; } if(walkingOne==FLAG_FALSE_ID5 || walkingOne==FLAG_FALSE_ID6 || walkingOne==FLAG_FALSE_ID7 || walkingOne==FLAG_FALSE_ID8 || walkingOne==FLAG_FALSE_ID9 || walkingOne==FLAG_FALSE_ID14 || walkingOne==FLAG_FALSE_ID15) { construcType=construcType^walkingOne; walkingOne*=2; } } if(i==ARRAYSIZE) break; printf("La cible est-elle %s ? (o/n)\n", option[i++]); scanf("%1s", &z); if(z==111) { construcType=construcType|walkingOne; walkingOne*=2; } else walkingOne*=2; } ID.type=construcType; puts("\n\n -FALSE_ID_FLAGS CHECKER: "); if(ID.type&FLAG_FALSE_ID2 || ID.type&FLAG_FALSE_ID0 || ID.type&FLAG_FALSE_ID1 || ID.type&FLAG_FALSE_ID3 || ID.type&FLAG_FALSE_ID4 || ID.type&FLAG_FALSE_ID10 || ID.type&FLAG_FALSE_ID11 || ID.type&FLAG_FALSE_ID12 || ID.type&FLAG_FALSE_ID13) { puts("FIRST CHECK: I.D. ERROR DETECTED"); error=1; } else puts("FIRST CHECK: CLEAN"); if(ID.type&FLAG_FALSE_ID5 && ID.type&FLAG_FALSE_ID6 && ID.type&FLAG_FALSE_ID7 && ID.type&FLAG_FALSE_ID8 && ID.type&FLAG_FALSE_ID9 && ID.type&FLAG_FALSE_ID14 && ID.type&FLAG_FALSE_ID15) { puts("SECOND CHECK: CLEAN"); } else { puts("SECOND CHECK: I.D. ERROR DETECTED"); error=1; } puts("\n -ID LOGIC CHECKER:"); if((ID.type&HOMME)==0 && (ID.type&FEMME)==0) { puts("ID LOGIC ERROR: No Gender"); error=1; } if((ID.type&HOMME) && (ID.type&FEMME)) { puts("ID LOGIC ERROR: Genders"); error=1; } if(((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE) && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF)==0 && (ID.type&SERVICE_SECURITE)==0 && (ID.type&CADRE)==0 && (ID.type&DIRECTEUR)==0) || ((ID.type&EMPLOYE_ADMINISTRATIF)==0 && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE) && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE)==0 && (ID.type&CADRE) && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE) && (ID.type&DIRECTEUR)==0) || ((ID.type&EMPLOYE_ADMINISTRATIF)==0 && (ID.type&SERVICE_SECURITE)==0 && (ID.type&CADRE) && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE)==0 && (ID.type&DIRECTEUR)==0) || ((ID.type&EMPLOYE_ADMINISTRATIF)==0 && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE)==0 && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE)==0 && (ID.type&CADRE) && (ID.type&DIRECTEUR)==0) || ((ID.type&EMPLOYE_ADMINISTRATIF) && (ID.type&SERVICE_SECURITE)==0 && (ID.type&CADRE)==0 && (ID.type&DIRECTEUR)) || ((ID.type&EMPLOYE_ADMINISTRATIF)==0 && (ID.type&SERVICE_SECURITE) && (ID.type&CADRE) && (ID.type&DIRECTEUR)==0)) { puts("ID LOGIC ERROR: Fonction"); error=1; } if((ID.type&TAILLE_1M30_A_1M70) && (ID.type&TAILLE_1M71_A_2M)) { puts("ID LOGIC ERROR: Height"); error=1; } if((ID.type&TAILLE_1M30_A_1M70)==0 &&(ID.type&TAILLE_1M71_A_2M)==0) { puts("ID LOGIC ERROR: No Height"); error=1; } if((ID.type&ASPECT_FORT) && (ID.type&ASPECT_MINCE)) { puts("ID LOGIC ERROR: Look"); error=1; } if((ID.type&ASPECT_FORT)==0 && (ID.type&ASPECT_MINCE)==0) { puts("ID LOGIC ERROR: No Look"); error=1; } if(error==1) { system("PAUSE"); return EXIT_FAILURE; } else { puts("LOGIC CHECK: CLEAN"); } printf("Monsieur %s, voici votre code identifiant: %ld", ID.user, ID.type); system("PAUSE"); return EXIT_SUCCESS; } /******* END OF SOURCE CODE *******/

Conclusion :


Des conseils sur unee meilleure algorithmique seraient les bienvenus!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.