Question

Quels sont les avantages de, par exemple, la rédaction de la première déclaration par rapport à la deuxième déclaration:

Première déclaration:

ANCON1 = ~0x0C;

Deuxième déclaration:

ANCON1 = 0xF3;

Je vois le second comme un choix clair que j'aurais fait, car il est plus simple que le premier. Pourquoi utiliser son complément quand il est si simple d'écrire ce que nous voulons.

Était-ce utile?

La solution

Benoit l'a dit à peu près. L'un est le complément, tous sauf ces bits, l'autre n'est que ces bits.

something&=~3;

Cela signifie souvent que vous vous concentrez sur ces deux bits où 0xfc est un accent sur les autres bits. La version ~ correspond directement à une instruction un peu claire sur certaines plates-formes qui font que l'auteur se sent mieux à l'écrire de cette façon. Et la version ~ est moins sujette aux bogues et aux erreurs, si vous modifiez la taille de la variable (sans déplacer ces deux bits), votre code fonctionne toujours, en utilisant 0xfc, le code est cassé et doit être touché partout où la variable est utilisée. (L'utilisation d'un #define pour cacher la constante aggrave cela pour déboguer. Cela pourrait l'améliorer si la définition est réutilisée, mais les dommages sont déjà causés).

À la fin de la journée, c'est une chose de style comme

if(!(x&something) {

contre

if((x&something)==0) {

contre

if(x&something) ; else {

Dans une classe de dessin ou de peinture, vous êtes susceptible d'être appris à se concentrer sur le négatif, l'arrière-plan, ne tracez pas le contour de l'objet, mais le contour de ce qui n'est pas l'objet.

Au collège (génie électrique, il y a au moins des décennies avant l'existence de l'ingénierie informatique), nous avons été encouragés à réfléchir en termes de logique négative. Parfois, affirmé signifie une logique positive parfois une logique négative et ne pense pas seulement. (Il en va de même pour la réflexion affirmée ou est une tension positive, VCC et désassé ou désactivé)

Avec cette opération bitwise en particulier, être en mesure de lire le code de toute façon, "Je met à zéro ces bits" vs "Je ne met pas ces bits". Parce que les deux sont corrects, juste une différence de style.

Il est tout aussi "simple" d'écrire le 0xc comme 0xf3, si on vous dit verbalement par exemple ou si une fiche technique dit que les bits [3: 2] sont quelque chose et ceci et cela quand zéro. Il n'est pas étiré pour le cerveau de traiter que comme 0xc, pour le traiter comme 0xf3, vous devez trouver plus d'informations sur la longueur de la chose, puis traiter les bits avant et après avant d'atteindre 0xf3. Ou vous avez fait le 0xf3 dans votre tête à partir du 0x0c et vous auriez pu utiliser ~ 0x0c et enregistrer l'étape. S'il y a un diagramme montrant tous les bits côte à côte avec des champs marqués, il devient un verre est à moitié vide ou à moitié plein, vous et vos yeux pouvez facilement vous concentrer sur le négatif et tirer directement 0xf3 ou se concentrer sur 0x0c puis inverser à Obtenez 0xf3 ou concentrez-vous sur 0xf3 et devez inverser pour obtenir 0x0c.

Les deux avantages, l'un moins important que l'autre, est que sur quelques processeurs, il est directement lié à une instruction et l'optimiseur n'a pas à fonctionner aussi dur (micro-optimisation), l'autre est une habitude d'éviter les bogues logiciels. Si vous avez utilisé un int il y a une poignée d'années avec 0xFFFFFFF3, puis compilé ce code aujourd'hui sans modifications contre une machine à 64 bits, vous avez peut-être pris vous-même dans un bug. Si cette méthode a été utilisée habituellement à travers le code, il y a beaucoup de portage à faire. Si ~ 0xc avait été utilisé, ce code pourrait avoir porté plus facilement. L'un implique la taille de la variable que l'autre ne fait pas.

Autres conseils

J'ai lu le premier All but 00001100 et le deuxième 11110011. Je trouve plus facile de comprendre quels bits ne sont pas définis mentalement, car il y en a moins.

Il n'y a pas de différence car les deux valeurs sont constantes et la première sera comptée et optimisée pour la seconde par votre compilateur. Utilisez celui qui rend le code plus compréhensible par vous et d'autres programmeurs.

L'autre chose serait si vous utilisiez la variable à Niger, puis pour écrire une variable dans le registre sur la plupart des microcontrôleurs utilise 2 commandes et pour écrire uniquement une variable pour enregistrer les usages 1.

Tout d'abord, ~ signifie le complément bits. Ne mélangez pas cela avec son complément, son complément est un moyen de traduire HEX au format entier signé.

En ce qui concerne les bonnes / mauvaises pratiques, vos deux exemples sont mauvais, car ils utilisent des "numéros magiques". La bonne façon d'écrire le même code serait

#define MASK 0x0C

ANCON1 = ~MASK;

Étant donné que le masque est quelque chose qui a du sens et que 0xf3 est un nombre magique aléatoire, vous devez utiliser le premier puis l'inverser.

Notez que l'opérateur ~ utilisé sur une constante entière est prétraité au moment de la compilation. Le code machine réel ressemblera toujours à quelque chose comme LOADx $F3.

Ce n'est généralement qu'une question de style. La première, x = ~y est un idiome couramment utilisé pour désigner Définissez tous les bits x sauf ceux de y.

Il est encore plus couramment utilisé avec le &= opérateur. Par exemple x &= ~y signifie effacer les bits x qui sont installés y. Dans ce cas, il est plus lisible d'écrire, par exemple x &= ~0x40 plutôt que x &= 0xFC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top