Et c'estg clair que quand on fait 6 & 3, les 2 opérandes sont converties en binaire
Cela n'a pas de sens : tout est sous forme de bits dans un ordinateur. Donc non, il n'y a pas de "conversion". Au mieux, c'est la représentation de ces bits en mémoire qui change : on peut interpréter la même série de bits comme etant un entier, un réel, un caractere, un tableau de bits, etc.
Ton message pourrait porter à confusion, je me permets donc d'apporter une précision : il ne faut pas oublier te travailler sur l'ensemble des bits !
Par exemple, pour "unit8_t a { 6 };" (a = 0b0111), ~a ne va pas faire 0b1000, mais 0b11111000. Il ne faut surtout pas oublier que uint8_t fait 8 bits et donc s'ecrit en fait : 0b00000111.
Ton message pourrait porter à confusion, je me permets donc d'apporter une précision : il ne faut pas oublier te travailler sur l'ensemble des bits!
Par exemple, pour "unit8_t a { 6 };" (a = 0b0111), ~a ne va pas faire 0b1000, mais 0b11111000. Il ne faut surtout pas oublier que uint8_t fait 8 bits et donc s'ecrit en fait : 0b00000111.
C'est une erreur qui arrive souvent.
- Edité par gbdivers il y a 2 minutes
Oui, tu as tout à fait raison...
Je m'étais limité à 4 bits pour la facilité, j'aurais du préciser que tous ceux que je ne représentais pas (parce que non significatif pour la valeur considérée) agirait forcément comme un 0
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
il semble que quand on utilise to_string avec les une ou 2 options, le "b" (qui indique que l'on travaille avec des bits) soit aussi remplacé par la première des options alors que ce n'est pas un "0" explicite.
Comment cela se fait-il ?
Merci
- Edité par pseudo-simple 30 novembre 2018 à 11:12:49
il semble que quand on utilise to_string avec les une ou 2 options, le "b" (qui indique que l'on travaille avec des bits) soit aussi remplacé par la première des options alors que ce n'est pas un "0" explicite.
Non. C'est exactement de ça dont on discutait avec koala01.
Je suis également en train de continuer la lecture de ta page.
Et je dois te dire que je trouve que tes explications sont très pédagogiques, et sont un bon point de ressourcement quand j'ai un blocage dans le livre de Scott Meyers. D'où la pause que j'ai faite pour me concentrer sur ta page.
Tu te mets à la place de celui qui te lit, et ça se ressent (par exemple avec la phrase "Notez bien que le bit correspondant à l'indice 0 est celui le plus à droite dans la représentation binaire (le bit de poids faible), le second bit est le second en partant de la droite et ainsi de suite.")
Je te congratule.
- Edité par pseudo-simple 30 novembre 2018 à 12:27:25
Je n'ai jamais dit que ton cours remplace celui de Mathieu, dont je reconnais les qualités car il m'a apporté aussi à plusieurs points de vue.
Je n'ai pas dit que je vais lire les 800 pages d'un coup, rassure-toi.
Je pense que les bonnes choses existent partout. Le cours de Mathieu n'est pas complet non plus. Par exemple, il n'y a pas la spécialisation de template de classe selon mes souvenirs ...
Mais quand il y a un point sur lequel j'ai besoin de ressources, ta pédagogie est clairement appréciable et appréciée (par moi en tout cas).
Je dis juste que quand je ne sais pas, ce n'est pas la peine d'insister sur les points négatifs car je suis alors conscient que j'ai besoin de ressources, d'où le fait que je viens demander.
Si je pose une question, c'est que j'ai besoin d'aide. Donc merci de ne pas insister à chaque fois lourdement sur le fait que je ne connais pas tout. Je ne suis pas encore devenu un compilateur ou un processeur
J'en suis conscient.
Pacifiquement
- Edité par pseudo-simple 30 novembre 2018 à 12:48:08
Donc merci de ne pas insister à chaque fois lourdement sur le fait que je ne connais pas tout.
On insiste sur le fait que tu as persévéré à suivre un mauvais cours, et la perte de temps qui va avec. Ce dont tu ne t'es pas rendu compte (et tu ne t'en rends toujours pas compte), car tu n'as pas le recul nécessaire pour juger de sa qualité.
ta définition : "Les bits sur les quels est appliqués ou non les modifications sont appelés le masque" ne me semble pas assez précise. Apparemment, dans l'intéressant exemple de code que tu avais donné pour expliquer les mots avec le schéma que tu as dessiné, le masque semblait désigner ce que tu as applique à ton mot de base et pas les bits sur lesquels tu appliques tes modifications.
Qu'en penses-tu ?
Cordialement
ps : remarque mineure :
Si je peux également me permettre , avec bienveillance, il y a une coquille de grammaire :
Les bits sur lesquels sont appliquées ou non les modifications, sont appelés le masque
- Edité par pseudo-simple 30 novembre 2018 à 17:07:02
Tu prends une feuille de papier et tu écris ta séquence de bits. (Mais cela fonctionne aussi avec du texte, avec les pixels d'une image, etc. Le concept de "masque" est très générique).
Tu fais la même chose pour ton masque (qui est aussi une séquence de bits. Mais tu peux faire aussi un masque de texte, un masque d'image, etc).
Il est possible de créer n'importe quelle règle d'utilisation d'un masque, mais dans notre cas, avec l'opérateur bit-à-bit &, cela correspond à la régle :
si un bit du masque est 0, on n'écrit pas
si un bit du masque est 1, on écrit
Ce qui revient a faire un trou dans la feuille là où il y a des 1 dans le masque.
Ensuite on positionne la feuille avec le masque sur la feuille avec la séquence de bits. Et on écrit 1 (par exemple) à chaque emplacement.
Au final, la séquence de bit à été modifiée grâce au masque : uniquement là où le masque contient 1, on a modifié la séquence.
Voilà, c'est maintenant que ça devient intéressant.
Je présente mon message en deux questions/parties :
Premier message :
gbdivers, dans votre exemple, si j'applique le calcul & bit à bit, alors j'aurais obtenu , en faisant
mot & masque
j'aurais obtenu comme résultat :
table de vérité : 1 1 0 0 1 1 1 0
et pas
1 1 0 0 1 1 1 1
Pour moi , le résultat renvoyé par à l'exécution serait
1 1 0 0 1 1 1 0
et pas
1 1 0 0 1 1 1 1
J'ai l'impression que dans votre paradigme, tu choisis d'écrire à 1, là où le masque le permet, alors que dans mon cas, je fais un calcul type table de vérité.
Mais ce qui est intéressant, n'est-ce pas ce que fait le compilateur ? et que fait-il alors ? quel paradigme choisit-il finalement ?
Seconde question : je reviens à un de mes précédents messages du fil :
EDIT :
YES, man a écrit:
Bonsoir,
j'ai besoin d'aide et d'explications car en allant dans les détails sur la page
1) Si je comprends bien u_int16, c'est un entier sur 16 bits ?
2) C'est quoi un uint_32 ? Je veux dire que dans cet exemple, je vois presque que des chiffres de 1 à 8... j'avoue ne pas être sûr de comprendre comment c'est codé et ce que c'est exactement. Dailleurs, c'est une question que je me pose depuis un moment.
3) j'ai testé le code avec et sans la ligne
std::cout << std::hex << std::showbase;
et je dois dire que le résultat me surprend.
Si quelqu'un peut m'envoyer un lien facile à comprendre avec des exemples simples pour comprendre ce qu'il se passe pour fixer les idées, ce serait sympa, car cette fois, je suis déterminé à éclaircir ce truc dans les détails une bonne fois pour toutes.
Merci par avance
Je reprends ce message précédent que j'ai écrit pour faire le lien avec mon message initial :
supposons que je sois au début d'un des mots d'un std::vector<bool>, donc placé sur un pointeur et que ce pointeur contient l'adresse:
uint32_t a = 0x12345678;
Puis, je suppose que je dois faire un décalage de 5 pour obtenir le bon bool (bit ) correspondant.
Concrètement, à bas niveau, comment je dois coder décalage ?
Est-ce que je dois faire
a & 5 ?
parce que bien que ça ne me paraisse pas consistant, c'est ce que semble suggérer le code donné par gbdivers au début :
class vector_bool { // je simplifie...
public:
class reference {
private:
size_type* _pointer;
size_type _mask;
public:
operator bool() { return (*_pointer & _mask); }
};
Merci par avance
- Edité par pseudo-simple 30 novembre 2018 à 21:25:52
gbdivers, dans votre exemple, si j'applique le calcul & bit à bit, alors j'aurais obtenu , en faisant
mot & masque
Ok, je comprends ta confusion. En fait, quand je dis "si un bit du masque est 0, on n'écrit pas. si un bit du masque est 1, on écrit", cela ne correspond pas du tout à l'expression "mot & masque".
On peut faire pleins de choses avec un masque : mettre les bits à 0 ou à 1, lire des bits, inverser les bits, etc. En fonction de ce qu'on veut faire, on va écrire des expressions différentes, en jouant avec les opérateurs bit-a-bit (& | ^ << >> ~) et des constantes (0x0, 0xFFFFFFFF, etc).
Dans mon idée, c'est le genre de choses qui peut peut fait en exercice. Mais peut etre qu'il faudrait que je montre 1 ou 2 exemples dans le cours, pour que ce soit plus clair.
Dans le cas de "mettre a 1 si le masque est 1" (ce que j'ai montré dans les images), on va avoir la table suivante :
si le bit est 0 et que le masque est 0, mettre a 0
si le bit est 1 et que le masque est 0, mettre a 1
si le bit est 0 et que le masque est 1, mettre a 1
si le bit est 1 et que le masque est 1, mettre a 1
Et on voit que cela correspond a l'opérateur OU | (il faut connaitre la table de vérité des opérateurs de base par coeur) et donc on peut écrire :
Puis, je suppose que je dois faire un décalage de 5 pour obtenir le bon bool (bit ) correspondant.
Concrètement, à bas niveau, comment je dois coder décalage ?
Non, il ne s'agit pas d'un "décalage" (qui est une opération bit-a-bit particulière), mais de masquage (c'est pas pour rien qu'on parle de ça). Je te laisse réfléchir à comment faire ça.
Une aide : un entier qui vaut 0 sera converti en booléen qui vaut false, sinon le booléen vaut true.
Le cours de Mathieu n'est pas complet non plus. Par exemple, il n'y a pas la spécialisation de template de classe selon mes souvenirs ...
Ne pas être complet c'est un petit soucis, ce qu'on reproche réellement au cours de Matthieu c'est d'être néfaste en apprenant des mauvaises pratiques et des torts dans la conception.
Après on lui reproche d'être obsolète et mal construit mais s'il était correct dans ce qu'il racontait ce ne serait que de l'amélioration, il y a des ressources pré-C++11 qui sont tout à fait corrects et valables malgré leur obsolescence. Là où c'est choquant que le cours de C++ de matthieu soit obsolète, c'est parce qu'il a un entreprise de formation qui ne maintient pas ses cours (parce que celui là justement est gratuit car un reliquat de sdz), et que beaucoup de discussions ont été menés pour proposer des solutions qui sont restés sans réponses.
Dream on, Dream on, Dream until your dream comes true
De toute façon, un cours vraiment complet, c'est un bouquin de 1500 pages minimum, qui en plus ne sera jamais aussi précis et complet que la norme.
Par contre, ce qui fait un bon cours, c'est former les lecteurs à se débrouiller par eux-mêmes par la suite, ainsi qu'à leur transmettre des connaissances correctes. Mieux vaut un cours C++03 qui forme les gens correctement qu'un cours soi-disant mis à jour pour C++17 mais qui reste tout aussi mauvais (cf Delannoy).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.