Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

exercices "op

1 réponse
Avatar
orthognito
Bonjour =C3=A0 tous,

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);

return (left | right);
}

int
main ()
{
printf ("%o\n", fixer_bits (0765, 5, 3, 0123));
printf ("%o\n", inverser (0765, 5, 3));
printf ("%o\n", rotdroite (0765, 3));
return (0);
}

1 réponse

Avatar
orthognito
On Mar 17, 11:18 pm, wrote:
Si quelqu'un se sent d'humeur didactique,
j'apprécierais ses critiques/remarques/suggestions concernant les
exercices 2-{6..8}.


Me suis fendu d'une session google ->
« Answers to Exercices » maintained by R. Heathfield :
http://users.powernet.co.uk/eton/kandr2/index.html

... ça fera l'affaire.