Decalage gauche/droite d'un nombre !

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 826 fois - Téléchargée 32 fois

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

Ajouter un commentaire

Commentaire

fredcl
Messages postés
547
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
7 octobre 2007
1 -
Pour ceux que cela interresse une explication de OgGiZ et moi même sur les opérateurs de décalage et les opérateurs binaire
http://www.cppfrance.com/article.aspx?Val=1965

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.