Bonjour,
Soit un nombre, par exemple un octet.
Je souhaite pouvoir affecter (mettre à 0 ou 1) seulement le bit "n", sans toucher à la valeur des autres bits.
Comment faire ?
Version imprimable
Bonjour,
Soit un nombre, par exemple un octet.
Je souhaite pouvoir affecter (mettre à 0 ou 1) seulement le bit "n", sans toucher à la valeur des autres bits.
Comment faire ?
Tu fais un masque:Code:
1
2 char cOctet = 0xFF; cOctet = cOctet & 0xF7; // pour changer le 3e bit à 0
Salut,
"Tout simplement" en utilisant les opérateur bits à bits :D
Si tu es sur qu'il faut passer la valeur du bit de 0 à un tu peux utiliser un code du genre de
Si tu veux changer inconditionnellement l'état d'un bit en son contraire (passer de 1 à 0 OU passer de 0 à 1), c'est le ou exclusif qu'il faut utiliserCode:
1
2
3 /*soit n étant le numéro du bit à changer */ char val; val=val | (1<<n);
Code:
1
2
3
4
5 char val; val = val ^ (1<<n);/* si b(n)=0 -->b(n) devient 1 * si b(n)=1 -->b(n) devient 0 */
Et pour forcer à zéro un bit :
Mais bon, tout ceci est plus facile avec une structure appropriée, par exemple std::bitset ou boost.dynamic_bitset.Code:
1
2 char val; val = val & ~(1 << n);
en fait, il faut distinguer la mise à 1 de la mise à 0 :
mise à 1 :
mise à 0 :Code:Value |= 1<<Position;
Code:Value &= ~(1<<Position);
Bien mieux que cela...
Il "suffit" de prendre les tables de vérité des différents opérateurs binaires en compte :D
A partir de là, le reste "tourne" tout seul :DCode:
1
2
3
4
5
6
7
8
9
10 a b a|b a&b a^b 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 ^ ^ ^ | | ou exclusif | | ET binaire |OU binaire
Merci de la réponse, mais je ne vois pas où tu veux en venir...
Je veux en venir au fait que tu as trois opérateurs de comparaison bits à bits.
Chacun de ces opérateurs réagit selon la table de vérité qui lui est propre, et tous les bits d'un type primitif réagiront donc en fonction de l'opérateur utilisé.
A partir de là, pour peu que tu saches ce que tu veux effectuer, tu saura quel opérateur utiliser.
La grosse difficulté de donner une "règle unique" résidant dans le fait que, selon les circonstances et les besoins réels, tu devra te tourner vers l'un ou l'autre choix :roll:
D'un autre côté, il est aussi bon de réfléchir à la nécessité d'utiliser un tel système, qui reste quand même d'une utilité restreinte, d'une complexité supérieure (AKA: nécessitant une attention plus importante) et d'une portabilité toute relative... Finalement, il est possible dans de nombreux cas de s'éviter le recours à de tels subterfuges :D
merci pour les éclaircissements ! :D
En fait si j'utilise ce système c'est parce que je suis en train de développer un driver pour une carte électronique, et j'accède à des registres mappés en mémoire : au bout des bits, il y a des transistors.
Je connais les tables de vérité des opérateurs bits à bits (pour faire de la programmation bas niveau, c'est utile ;-).
J'ai eu beau me triturer les boyeaux de la tête, je n'ai pas trouvé l'opération unique qui permette de modifier l'état d'un bit dans un nombre sans modifier les autres; d'où ce post.