Je m'initie au C avec =C2=AB Le langage C, Norme ANSI - 2e =C3=A9dition =C2=
=BB de
Kernighan & Ritchie. Si quelqu'un se sent d'humeur didactique,
j'appr=C3=A9cierais ses critiques/remarques/suggestions concernant les
exercices 2-{6..8}. Je n'ai pas achet=C3=A9 les exercices corrig=C3=A9s et c=
es
machins binaires c'est assez nouveau pour moi :)
Si ce message contrevient aux us et coutumes du lieu, je suppose que
vous me le ferez savoir et je m'en excuse par avance ;)
#include <stdio.h>
/*
* Exercice 2-6 :
* =C3=89crivez une fonction "fixer_bits (x, p, n, y)" qui retourne la
* valeur obtenue en rempla=C3=A7ant les n bits de x commen=C3=A7ant =C3=A0 =
la po-
* sition p par les n bits de droite de y, sans toucher aux autres.
*/
unsigned int fixer_bits (unsigned int x, unsigned char p, unsigned
char n,
unsigned int y);
/*
* Exercice 2-7 :
* =C3=89crivez une fonction "inverser (x, p, n)" qui retourne la valeur
* obtenue en inversant les n bits de x commen=C3=A7ant =C3=A0 la position =
p
* (c.=E2=80=90=C3=A0=E2=80=90d. en mettant les 1 =C3=A0 0 et vice=E2=80=
=90versa), sans toucher aux
* autres.
*/
unsigned int inverser (unsigned int x, unsigned char p, unsigned char
n);
/*
* Exercice 2-8 :
* =C3=89crivez une fonction "rotdroite (x, n)" qui retourne la valeur
* obtenue en faisant subir =C3=A0 x une rotation de n bits vers la
* droite.
*/
unsigned int rotdroite (unsigned int x, unsigned char n);
int main (void);
unsigned int
fixer_bits (unsigned int x, unsigned char p, unsigned char n, unsigned
int y)
{
unsigned int mask =3D ~0 << p + 1 | ~(~0 << p + 1 - n);
unsigned int framed_y =3D (y & ~(~0 << n)) << p + 1 - n;
return (x & mask | framed_y);
}
unsigned int
inverser (unsigned int x, unsigned char p, unsigned char n)
{
unsigned int mask =3D ~0 << p + 1 | ~(~0 << p + 1 - n);
return (x & mask | ~x & ~mask);
}
unsigned int
rotdroite (unsigned int x, unsigned char n)
{
unsigned int i =3D x | ~x;
unsigned char wl =3D 0;
for (; i > 0; i =3D i >> 1)
++wl;
n =3D n % wl;
unsigned int right =3D x >> n;
unsigned int left =3D (x & ~((x | ~x) << n)) << (wl - n);