/******************* manipbits.cpp *****************/ /* YAKOUBENE Karim */ /* NICOLLE Raphael */ /* Manipulation de Bits */ /* repertoire: / */ /* Formation: ASPE */ /* Date: 13/11/2007 */ /* Description: */ /***************************************************/ #include using namespace std; const int tailleint = 8 * sizeof(int); void aff_bits( int n ); // affiche la representation binaire de "n" int inverse( int x, int p, int n ); // complmente les n bits de x partir du bit la position p int rot_droite( int n, int b ); // permutation circulaire vers la droite de b bits d'un entier n int main() { int x, n, p, b; cout << "Entrer un nombre:" << endl; cin >> x; cout << "Aff_Bits" << endl; aff_bits( x ); cout << "Inverse" << endl; cout << "Entrer la position a partir de laquelle complementer le nombre:"; cin >> p; cout << "Entrer le nombre de bits a complementer:"; cin >> n; x = inverse( x, p, n ); aff_bits( x ); cout << "Rot_Droite" << endl; cout << "Entrer le nombre de bits permuter vers la droite:"; cin >> b; x = rot_droite( x, b ); aff_bits( x ); return 0; } void aff_bits( int n ) { unsigned int bit; unsigned int masque = 1; for ( int k = 0; k < tailleint - 1; k++ ) masque <<= 1; // permet de dcaler le 1 vers la gauche; for ( int i = 0; i < tailleint; i++ ) { bit = n & masque; // ce masque permet de dterminer la valeur du premier bit de n en mettant tous les autres zro if ( bit != 0 ) bit = 1; cout << bit << " "; n <<= 1; } cout << endl; } int inverse( int x, int p, int n ) { unsigned int position = 1; // variable permettant de positionner le premier bit "1" la position p int nb = 1; // compteur permettant l'ajout d'un bit "1" aprs la position p dans le masque for ( int i = 0; i < p - 1; i++ ) { position <<= 1; if ( nb < n ) { position += 1; nb++; } } x ^= position; return x; } int rot_droite( int n, int b ) { unsigned int masque = 1; masque &= n; for ( int k = 0; k < tailleint - 1; k++ ) masque <<= 1; for ( int i = 0; i < b; i++ ) { n <<= 1; if ( masque == 1 ) n |= masque; } return 1; }