/********************************************************************************** *** Etudiant : Nicolas Vion *** *** Tp.cpp : Manipulation des bits *** *** Formation : ASPE en informatique *** *** Date : 19-11-2007 *** **********************************************************************************/ /********************************************************************************** Directives de pr�-processeur **********************************************************************************/ #include #include /*definition de constante avec limite type entier specifique au compilateur utilise*/ #include // permet l'utilisation fonctions E/S std #include // fonctions mathematique pour la fonction puissance using namespace std; /********************************************************************************** Definition des constantes : **********************************************************************************/ const unsigned TAILLE_d_un_INT = 8 * sizeof(unsigned); /**************************************************************************************************** Instruction Compilateur (permet au compilateur de s'adapter au systeme) : ****************************************************************************************************/ /* Pour le systeme d exploitation Windows */ #ifdef WIN32 #define CLEARSCREEN "cls" //Pour la mise en pause /* Pour le systeme d exploitation Linux */ #elif defined(linux) #define CLEARSCREEN "clear" //Pour la mise en pause /* Sinon on erreur car le systeme d exploitation n'est pas reconnu */ #else #error not defined for this platform #endif /********************************************************************************** Fonction validation de saisie en C++ **********************************************************************************/ unsigned valid_saisie ( void ) { unsigned nb; bool ok; do { ok = true; cout << endl << endl <<" Votre choix pour continuer ? "<< endl << endl; if ( !(cin >> nb) ) { cin.clear(); ok = false; } cin.ignore(80, '\n'); cout << endl; } while ( !ok ); return ( nb ); } /********************************************************************************** Demande de la saisie du nombre entier **********************************************************************************/ unsigned EntierTravail ( void ) { unsigned nb = 0; //Variable contenant l entier. Par defaut, on initialise a zero. cout << endl << endl << " Programme de Nicolas VION en ASPE Informatique" << endl ; cout << " ____________________________________________________________" << endl << endl ; cout << endl << endl; cout <<"******************************************************************************"< 5); /* Appel validation de saisie tant que le nombre saisi est different de ceux propos�*/ return ( menu ); } /********************************************************************************** Mise en attente du programme **********************************************************************************/ void Pause(void) { cout << "\n Appuyer sur entree pour Continuer "; cin.ignore(80, '\n'); } /********************************************************************************** Fonction affichage de bits : **********************************************************************************/ void aff_bits( unsigned nb ) { unsigned mask ; //On decale le masque de 4*8 -1 position. ( Ne pas oublier le -1 sinon on ne pourra pas voir le premier bit ) mask = 1 << (TAILLE_d_un_INT - 1) ; //Avec TAILLE_d_un_INT = 8 * sizeof(unsigned) cout << " " << nb << " en binaire : " << endl< 32); //Validation du nombre. Il faut qu'il soit compris entre 1 et 32 /********************************************************************************** Boucle de saisie du nombre de bits a modifier **********************************************************************************/ do { cout << " Saisissez le nombre de bit(s) a modifier, "<< endl <<" (un nombre compris entre 1 et " << ( (32+1) - p ) << " ) "; n = valid_saisie (); } while ( n < 1 || n > ( (32+1) - p) ); //Validation du nombre /********************************************************************************** Affichage du resultat avec appel de la fonction aff_bits **********************************************************************************/ cout << "**************************Avant l'Inverion : ****************************" << endl< 32 ); for (unsigned cpt=1; cpt<(b); cpt++) mask = (mask | (bits=unsigned(pow(2,cpt)) ) ); /*decalage vers la gauche des b bits pour les placer en bout de chaine*/ mask <<= (TAILLE_d_un_INT - b); mask = (nb & mask); mask >>= (TAILLE_d_un_INT - b); /********************************************************************************** affichage du nombre avant la rotation **********************************************************************************/ cout << "*************************Avant la rotation*************************" << endl << endl; aff_bits (nb); cout << endl << endl; // decalage vers la gauche du nombre de b bits nb <<= b; nb = (nb | mask); /********************************************************************************** affichage du nombre apres la rotation **********************************************************************************/ cout << "*************************Apres decalage****************************" << endl << endl; aff_bits (nb); cout << endl << endl; } /********************************************************************************** Fonction main **********************************************************************************/ int main(void) { unsigned menu, nb; nb = EntierTravail(); //Appel de la saisie du nombre � traiter do { menu = Menu( nb ); //Appel de la saisie du numero de menu switch (menu) { case 1 : aff_bits(nb); //Affichage du nombre en binaire Pause(); system(CLEARSCREEN); break; case 2 : inverse(nb); //Affichage de l'inverse a la p ieme position Pause(); system(CLEARSCREEN); break; case 3 : rot_gauche(nb); //Affichage de la rotation Pause(); system(CLEARSCREEN); break; case 4 : nb = EntierTravail(); //Redemande de saisie du nombre system(CLEARSCREEN); break; } }while ( menu < 0 || menu > 6 || menu !=5); cout << "Merci d'avoir essaye ce programme !" << endl << endl ; return 0; }