Decalage gauche/droite d'un nombre !

Contenu du snippet

J'ai fais ca pour Skyman !

On fait un decalage, ou plus excactement une rotation !!!!

Source / Exemple :


#include <stdio.h>
#include <conio.h>
#include <limits.h>

// ---------------------------------------------------------
// donne les nombre de bits d'un type
#define NB_BIT(type) (sizeof(type)*CHAR_BIT)
// permet d'avoir le 'n' eme d'un nombre 'x'
#define GET_N_EME_BIT(x,n)     ( (x & (1<<n)) >> n )
// met 'b' (0 ou 1) dans le 'n' eme bit de 'x'
#define SET_N_EME_BIT(x,n,b)   (x = ( (b<<n) ^ x ))
// ---------------------------------------------------------
// decale 'x' d'un rang vers la droite
int DecalageDroitUneFois(unsigned int x)
{
int fisrtBit;
fisrtBit = GET_N_EME_BIT(x,0);
x >>= 1;
SET_N_EME_BIT(x,(NB_BIT(unsigned int) - 1),fisrtBit);
return x;
}
// ---------------------------------------------------------
// decale 'x' de 'n' rang vers la droite
unsigned int DecalageDroit(unsigned int x,unsigned int n)
{
while(n--)
  x = DecalageDroitUneFois(x);
return x;
}
// ---------------------------------------------------------
// decale 'x' d'un rang vers la gauche
int DecalageGaucheUneFois(unsigned int x)
{
int lastBit;
lastBit = GET_N_EME_BIT(x,(NB_BIT(unsigned int) - 1));
x <<= 1;
SET_N_EME_BIT(x,0,lastBit);
return x;
}
// ---------------------------------------------------------
// decale 'x' de 'n' rang vers la gauche
unsigned int DecalageGauche(unsigned int x,unsigned int n)
{
while(n--)
  x = DecalageGaucheUneFois(x );
return x;
}

// ---------------------------------------------------------
// afficher un nombre en binaire
void PrintBinaryNumber(unsigned int n)
{
unsigned int mask;
mask = 1 << (NB_BIT(unsigned int) - 1);
// on affiche
do
  {
  printf((n & mask) ? "1" : "0");
  }while(mask >>= 1);
printf("\n");
}
// ---------------------------------------------------------
// ============ MAIN ============
int main(int argc,char **argv)
{
unsigned int a = 21401;

printf("\n=== DECALAGE VERS LA DROITE ===\n");
PrintBinaryNumber(DecalageDroit(a,0));
PrintBinaryNumber(DecalageDroit(a,1));
PrintBinaryNumber(DecalageDroit(a,2));
PrintBinaryNumber(DecalageDroit(a,32));
PrintBinaryNumber(DecalageDroit(a,10000));
PrintBinaryNumber(DecalageDroit(a,10001));
PrintBinaryNumber(DecalageDroit(a,10002));
PrintBinaryNumber(DecalageDroit(a,10003));
PrintBinaryNumber(DecalageDroit(a,10004));
PrintBinaryNumber(DecalageDroit(a,10005));

printf("\n=== DECALAGE VERS LA DROITE ===\n");
PrintBinaryNumber(DecalageGauche(a,0));
PrintBinaryNumber(DecalageGauche(a,1));
PrintBinaryNumber(DecalageGauche(a,2));
PrintBinaryNumber(DecalageGauche(a,32));
PrintBinaryNumber(DecalageGauche(a,10000));
PrintBinaryNumber(DecalageGauche(a,10001));
PrintBinaryNumber(DecalageGauche(a,10002));
PrintBinaryNumber(DecalageGauche(a,10003));
PrintBinaryNumber(DecalageGauche(a,10004));
PrintBinaryNumber(DecalageGauche(a,10005));

getch();
return 0;
}

A voir également

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.