Changement d'une région de bits

Quel code ci-dessous permet de définir la valeur b aux bits d’index i-1, i, et i+1 de number (considérant que i = 0 est le bit le moins significatif) ? Pour raison de simplicité, vous pouvez partir du principe que i ne pointe pas vers un bit se trouvant à une des extrémités de number, et que bien que b soit de type int, il ne peut prendre que la valeur 0 ou 1.

Par exemple, pour number = 00000000, i = 2, b = 1, number devrait devenir 00001110.

Note : pour des raisons de clarté, certaines réponses sont divisés en deux étapes.

A.

int step1 = number & ~((1 << (i-1)) | (1 << i) | (1 << (i+1)))
int step2 = step1 | (b << (i-1)) | (b << i) | (b << (i+1));
number = step2;

B.

int step1 = number & ~((1 << (i-1)) & (1 << i) & (1 << (i+1)));
int step2 = step1 & (b << (i-1)) & (b << i) & (b << (i+1));
number = step2;

C.

number = number | (b << (i-1)) | (b << i) | (b << (i+1));

D.

int step1 = number & (0 << (i-1)) & (0 << i) & (0 << (i+1));
int step2 = step1 & (b << (i-1)) & (b << i) & (b << (i+1));
number = step2;

E.

int step1 = number ^ (b << (i-1)) | (b << i) | (b << (i+1));
int step2 = step1 | (b << (i-1)) | (b << i) | (b << (i+1));
number = step2;

Solution

Afin de changer la valeur d’un bit à un index i donné sans connaître b à l’avance, deux étapes sont nécessaires:

Dans cet exercice, il y a 3 bits à changer. Afin de mettre les 3 à 0, il nous faut construire une masque contenant des 1 partout sauf aux 3 indexes correspondants, et appliquer l’opérateur AND entre la valeur et notre masque. Un tel masque peut être construit de la manière suivante:

Le masque est donc:

~((1 << (i-1)) | (1 << i) | (1 << (i+1)))

Similairement, un masque contenant b aux 3 indexes en question, et 0 ailleurs peut-être construit de la manière suivante:

(b << (i-1)) | (b << i) | (b << (i+1))

Il ne reste qu’à appliquer AND entre le nombre et le premier masque, puis OR entre le résultat et le second masque.

La réponse correcte est donc la réponse A