Ce n' (x ^ 0 x 1) != 0 signifie?
Je suis tombé sur l'extrait de code suivant
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Ce n' x ^ 0x1
veux dire? C'est une technique standard?
- Code de la dissimulation de l' est tout à fait standard.
- Il ya quelques jours j'ai aussi eu quelques situation semblable, stackoverflow.com/questions/19730348/why-101-is-11-in-c
- Cela peut être résolu avec la même approche qu'un "normal" d'équation:
0 != (x ^ 1)
→ xor deux côtés par 1 →(0 ^ 1) != (x ^ 1 ^ 1)
→ simplifier →1 != x
- Je ne vois pas comment
if (1 != x)
est dur à écrire. - Diverses observations, d'abord par @Spook, indiquer clairement que les
type
dex
n'est pas donné - par conséquent, nous ne savons pas c'est un entier dans cette C++ tagged problème. Bien sûr, si c'est C oux
est un entier, la réponse est facile, mais ce n'est pas une donnée et la possibilité de surcharger lesoperator ^
existe. - Je ne vois pas en quoi cela fait de nombreuses upvotes...
Vous devez vous connecter pour publier un commentaire.
De l'opération XOR (
x ^ 0x1
) inverse le bit 0. Donc, l'expression signifie: si le bit 0 de x est 0, ou toutes les autres bits de x est 1, alors l'expression est vraie.L'inverse, l'expression est fausse si x == 1.
Donc, le test est le même que:
et est donc (sans doute) inutilement obscurci.
^
est le bit à bit XOR opération0x1
est1
en hexadécimalx ^ 0x1
inverser le dernier bit dex
(reportez-vous à la XOR table de vérité dans le lien ci-dessus si ce n'est pas clair pour vous).Donc, la condition
(0 != ( x ^ 0x1 ))
sera vrai six
est plus grand que 1, ou si le dernier bit dex
est de 0. Ce qui ne laisse que x==1 comme une valeur à laquelle la condition sera fausse. C'est donc équivalent àP. S. tu parles d'une façon de mettre en œuvre un tel état, je pourrais ajouter. Ne pas le faire. Et si vous devez écrire le code compliqué, laisser un commentaire. Je vous en prie.
x==0
;4 ^ 0x1
est vrai, mais4==0
est évidemment faux.if (x == 0)
", n'est-il pas égal àx != 1
?x
est un type intégral. Si c'est unfloat
oudouble
, alors je crois que l'expression de rendement vrai pour1.0 <= x < 2.0
. Et six
est un type défini par l'utilisateur, l'expression pourrait retourner true six
est un Yugo, le kangourou, le célèbre compositeur de l'anniversaire, ou n'importe quel nombre qui partage au moins trois chiffres avec le courant libellé en dollar du prix du thé en Chine.operator^
pourfloat
/double
.float
oudouble
convertir implicitement àint
, n'est-ce pas?^
(et d'ailleurs==
) dans divers intéressant la mode.operator
fonctions pour les types fondamentaux, pour deux raisons: 1) ce n'est pas une fonction, et 2) vous ne pouvez pas créer un nouveauoperator
pour n'importe quel type qui est en conflit avec une définition existante de toute façon, parce que sinon, vous courez dans toutes sortes de fous "que voulez-vous dire?" au moment de la liaison.1^q
, mais peut, parq^1
. Suis-je misremembering?q
est, de toute évidence. Vous pouvez certainement faire unMyType::operator^(float)
ou similaire.Cela peut sembler simpliste comme explication, mais si quelqu'un veut aller à travers elle lentement, il est ci-dessous:
^
est un XOR au niveau du bit opérateur en c, c++ et c#.La table de vérité de a xor b:
Donc, nous allons illustrer la
0 == ( x ^ 0x1 )
expression sur le niveau binaire:donc:
Il est OU-exclusif (XOR) de l'opérateur. Pour comprendre comment il fonctionne, vous pouvez exécuter ce code simple
La sortie sera
De sorte que cette expression
sera égal vrai que lorsque x != 0 x 1.
Il ne change pas de x lui-même. Il vérifie seulement si x est égal à 0 ou 1. cette rxpression pourrait être changé pour
Il vérifie que
x
est en fait pas0x1
...xor
ingx
avec0x1
entraînera 0 seulement six
est0x1
... c'est un vieux truc utilisé principalement en langage d'assemblage!= 1
?xor
approche contenait moins de code machine, et a été exécuté plus rapidement que l'assignation correspondante à0
... cependant, cette question contient unxor
ET une comparaison, donc je pense que le!=
pourrait être plus rapide. Je ne suis pas si sûr cependant, il serait nécessaire de voir certains généré par le compilateur de l'assemblée.La
^
opérateur xor au niveau du bit. Et0x1
est le nombre1
, écrit comme une constante hexadécimale.Donc,
x ^ 0x1
donne une nouvelle valeur, qui est le même quex
, mais avec le bit le moins significatif renversé.Le code ne fait rien de plus que de comparer x avec 1, dans un très compliquées et obscures de la mode.
Le xor (ou exclusif) de l'opérateur est le plus couramment utilisé pour inverser un ou plusieurs bits.
L'opération est à vous demander si exactement un des bits êtes l'un, cela soulève la table de vérité de A et de B sont des entrées, Y est de sortie):
Maintenant le but de ce code semble être de vérifier si excatly le dernier bit est à 1, et les autres sont à 0, ce qui correspond
if ( x != 1 )
.La raison de cet obscur méthode peut être qu'avant de manipulation de bits techniques ont été utilisées, et peut-être utilisé à d'autres endroits dans le programme.
^
est au niveau du bitxor operator
dansc
. Dans votre cas, x est xor ed avec 1. par exemplex
a la valeur 10, puis10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d
si la condition devient vraie.10 != 1010
10 (decimal) == 1010 (binary)
b
ou quelque chose là-bas?La bit-à-bit de test semble être une volonté délibérée de dissimulation, mais si les données sous-jacentes aux données d'entreprise à partir d'un mainframe IBM système, il peut être tout simplement que le code a été écrit afin de refléter la documentation d'origine. IBM formats de données de revenir dans les années 1960 et souvent encoder des drapeaux unique de bits dans un mot pour gagner de la place. Comme les formats ont été modifiés, les drapeaux, les octets ont été ajoutés à la fin des enregistrements existants afin d'assurer la rétrocompatibilité. La documentation d'un SMF d'enregistrement, par exemple, peut afficher le code de langage d'assemblage pour tester trois bits individuels dans un délai de trois mots différents dans un seul enregistrement de décider que les données d'un fichier d'entrée.
Je connais beaucoup moins sur TCP/IP internes, mais vous pouvez trouver des indicateurs de bits, ainsi.
L'opérateur ^ est de la bit-à-bit-xor (voir &, | ). Le résultat pour un peu, paire est,
Donc l'expression,
inverse/retourne le 0e bits de x (en laissant les autres bits inchangé).
Examiner si x peut avoir des valeurs en outre 0x0 et 0x1? Lorsque x est un seul champ de bits, il peut avoir seulement les valeurs 0 x 0 et 0 x 1, mais lorsque x est un int (char/court/long/etc), les bits d'ailleurs bit0 peut affecter le résultat de l'expression.
L'expression est donnée permet de bits à côté de bit0 à affecter le résultat,
Équivalente truthiness comme celui-ci (plus simple expression,
Remarque que cette expression serait d'examiner seulement bit0,
Donc l'expression telle que présentée est vraiment la combinaison de deux expression des contrôles,
L'auteur n'a l'intention de vérifier uniquement les bit0, et ont voulu utiliser cette expression,
Ou l'auteur n'a l'intention de comingle les valeurs de bit1-bitN et le xor de bit0?
Je suis en ajoutant un nouvel élément de réponse parce que personne n'a vraiment expliqué comment obtenir la réponse intuitive.
L'inverse de
+
est-
.L'inverse de
^
est^
.Comment résoudre
0 != x - 1
pourx
? Vous+ 1
sur les deux côtés:0 + 1 != x - 1 + 1
→1 != x
.Comment voulez-vous résoudre
0 != x ^ 1
pourx
? Vous^ 1
sur les deux côtés:0 ^ 1 != x ^ 1 ^ 1
→1 != x
.Je suppose qu'il y a d'autres éléments ou peu-les valeurs de champ dans
x
, et cela est destiné à tester que seul le bit est défini. Dans le contexte, je suppose que c'est la valeur par défaut, et que, par conséquent, l'encodage de ce et certains sont liésm
(probablement plus cher à encoder) peuvent être ignorés, car ils doivent à la fois être la valeur par défaut, initialisé dans le constructeur ou similaire.En quelque sorte, le décodeur doit être en mesure d'en déduire que ces valeurs sont manquantes. Si elles sont à l'extrémité de la structure, il peut être communiquée au moyen d'un
length
valeur qui est toujours présente.Le XOR est utile en C# drapeau enum. Pour supprimer unique indicateur de valeur d'enum, il est nécessaire d'utiliser l'opérateur xor (référence ici)
Exemple:
Il y a beaucoup de bonnes réponses, mais j'aime à le dire de façon plus simple.
Tout d'abord. Une instruction if n'est faux si l'argument est égal à zéro. Cela signifie que la comparaison n'est pas égale à zéro est inutile.
Alors que nous laisse avec:
Un XOR avec une. Ce qu'un XOR n'est essentiellement détecter bits qui sont différents. Ainsi, si tous les bits sont les mêmes, il sera de retour 0. Puisque 0 est faux, la seule fois où il retournera false si tous les bits sont les mêmes. Ainsi, il sera faux si les arguments sont les mêmes, même s'ils sont différents...tout comme les pas égal à opérateur.
Si fait, la seule différence entre les deux est que
!=
renvoie 0 ou 1, alors que^
sera de retour n'importe quel nombre, mais la truthyness le résultat sera toujours le même. Un moyen facile de le penser il est.La finale de la "simplification" est la conversion de
0x1
à la décimale qui est de 1. Par conséquent, votre déclaration est équivalent à:^ est un XOR au niveau du bit opérateur
Si x = 1
ici 0 == ( x ^ 0 x 1 )
Si x = 0
ici 0 != ( x ^ 0 x 1 )
La table de vérité du xor b:
Le code signifie simplement
La norme technique qui pourrait être utilisé, ici, est de répéter un langage tel qu'il apparaît dans le contexte environnant, pour plus de clarté, plutôt que de les dissimuler en la remplaçant par un idiome qui est arithmétiquement plus simple mais contextuellement pas de sens.
Le code environnant peut faire référence fréquente à
(x ^ 1)
, ou le test peut se demander "si le bit 0 est dans l'autre sens, ne serait-ce masque de bits est vide?".Étant donné que la condition qui provoque quelque chose à
encode()
ed, peut-être que dans le contexte de l'état par défaut du bit 0 a été inversé par d'autres facteurs, et nous avons seulement besoin de coder des informations supplémentaires si l'un des bits de dévier de leur valeur par défaut (normalement tous les zéro).Si vous prenez l'expression de leur contexte et de demander ce qu'il fait, vous donnent l'intention sous-jacente. On pourrait tout aussi bien regarder l'assemblée de sortie du compilateur et de voir qu'il est tout simplement un direct comparaison d'égalité avec 1.
Que je vois les réponses manquer une règle simple pour la manipulation de
XOR
s. Sans entrer dans les détails de ce^
et0x
moyenne (etif
, et!=
etc), l'expression0 != (x^1)
peut être remaniée comme suit en utilisant le fait que(a^a)==0
: