/******************* manipbits.cpp *****************/
/* YAKOUBENE Karim */
/* NICOLLE Raphael */
/* Manipulation de Bits */
/* repertoire: / */
/* Formation: ASPE */
/* Date: 13/11/2007 */
/* Description: */
/***************************************************/
#include <iostream>
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;
}