All posts by nick

exercice sur les operations binaires.

voici un exercice tire du livre learning c with K&R 2nd edition
il sagit de l’exercice 2-6

Exercise 2-6. Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position
p set to the rightmost n bits of y, leaving the other bits unchanged.

voici une solution trouver sur un forum.
je vais tenter d’expliquer le resonnement pour y arriver

——————————————————————————————

// Assume x = 10010011 (binary), p = 3 (decimal), n = 2 (decimal), y = 11001010 (binary)
// Also assume rightmost bit (LSB) is position 1.

uint8_t setbits(uint8_t x, uint8_t p, uint8_t n, uint8_t y)
{
uint8_t mask;
uint8_t temp;

mask = ~0; // All bits set (mask = 11111111)
mask >>= 8 – n; // n bits set in lowest position (mask = 00000011)

temp = y & mask; // set to first n bits of y (temp = 00000010)
temp <<= p – 1; // set to n bits of y at position p (temp = 00001000)

mask <<= p – 1; // n bits set at position p (mask = 00001100)

x &= ~mask; // n bits at position p cleared (x = 10010011)
x |= temp; // x set to first n bits of y at position p (x = 10011011)

return x;
}

——————————————————————————————

explications :

Il faut mettre le nombre de bit de longeur n venat de y(qui commence a la position p) dans x sans modifier les autres bits.
il faudra donc pour cela utiliser un masque, on l’apelle temp.

ce masque temp devra donc avoir des valeurs qui seront les seules valeurs a modifier les restantes ne seront pas modifier et garderont leurs valeurs apres l’operation.

l’operateur le plus apte a cette mission semble etre le OU (|), car il met a ‘1’ les bits qui sont a ‘0’ mais pas bit qui sont a ‘1’ ou ‘0’ vers ‘1’ si le temp est a ‘0’.

comment obtenir cette temp.
on sait que les bits a modifier sur ce temp seront a ‘1’ les autres seront a ‘0’, il seront aussi a la bonne position.

pour l’instant mettons en pausse l’etape precedente nous y reviendront.

il faut dons modifier certains bits de x, donc il va falloir initialiser les bits qui seront modifier.
il faudra un autre masque appelons le MASK.
ce masque devra faire une operation ET (&) entre MASK et X, mettant les valeurs a initialiser ( a ‘0’) dans x a zero, celles qui ne doivent pas etre modifier seront a ‘1’ dans le masque MASK ex : 0 & 1 = 0, 0 & 0 = 0.

Donc ce masque MASK doit connaitre la position des bits a modifier, p nous aide dans cette tache, car il indique la position ou commencer a compter les bits n a modifier (en allant ver la droite).

on sait combien de bit ne doivent pas etre modifier 8bits – n donne le nombre de bit qui ne seont pas modifier.

maintenant MASK connait le nombre de bits a modifier il seront mis tous a droite dans MASK, L’etape suivante est de les positionner.

(pour cela on utilisera Temp qui connait les bits a modifier et leur positions.)

on utilisera MAK et Y pour avoir les valeurs qui doivent etre apporter a X et seulemtn celles-ci.
un & operateur fera l’affaire, seulement les positions a calquer de Y seront dans TEMP, si Y =’0′ il sera mis a ‘0’ dans TEMP, si Y = ‘1’ il sera tjs a ‘1’ dans MASK.

donc TEMP decoulera de Y & MASK.

temp connais maintenant les valeurs a modifier ainsi que leur positions.

et voila.