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 ?
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char cOctet = 0xFF; cOctet = cOctet & 0xF7; // pour changer le 3e bit à 0
Salut,
"Tout simplement" en utilisant les opérateur bits à bits
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 utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /*soit n étant le numéro du bit à changer */ char val; val=val | (1<<n);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 */
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char val; val = val & ~(1 << n);
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
en fait, il faut distinguer la mise à 1 de la mise à 0 :
mise à 1 :
mise à 0 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Value |= 1<<Position;
Code : Sélectionner tout - Visualiser dans une fenêtre à part Value &= ~(1<<Position);
Bien mieux que cela...
Il "suffit" de prendre les tables de vérité des différents opérateurs binaires en compte
A partir de là, le reste "tourne" tout seul
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
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
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![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
merci pour les éclaircissements !
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.
Partager