Je suis tombé sur le bout de code suivant
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Qu'est-ce que x ^ 0x1
Comment ? S'agit-il d'une technique standard ?
Je suis tombé sur le bout de code suivant
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Qu'est-ce que x ^ 0x1
Comment ? S'agit-il d'une technique standard ?
L'opération XOR ( ^
) inverse le bit 0. Donc l'expression signifie effectivement : si le bit 0 de x est 0, ou si n'importe quel autre bit de x est 1, alors l'expression est vraie.
Inversement, l'expression est fausse si x = 1.
Donc le test est le même que :
if (x != 1)
et est donc (sans doute) inutilement obscurci.
^
est une opération XOR. 0x1
est 1
en format hexagonal. x ^ 0x1
inversera le dernier bit de x
.
Donc, la condition (( 0 != ( x ^ 0x1 ) )
sera vrai si x
est supérieur à 1 ou si le dernier bit de la variable x
est 0. Ce qui ne laisse que x==1 comme valeur à laquelle la condition sera fausse. C'est donc équivalent à
if (x != 1)
Cette explication peut sembler trop simpliste, mais si quelqu'un souhaite la parcourir lentement, il peut la trouver ci-dessous :
^
est un XOR par bit en c, c++ et c#.
Un XOR au sens des bits prend deux modèles de bits de longueur égale et effectue l'opération l'opération logique OU exclusif sur chaque paire de bits correspondants.
Le OU exclusif est une opération logique qui produit un résultat vrai lorsque les deux entrées sont différentes (l'une est vraie, l'autre est fausse). entrées sont différentes (l'une est vraie, l'autre est fausse).
Le site table de vérité de a xor b :
a b a xor b
----------------------------
1 1 0
1 0 1
0 1 1
0 0 0
Illustrons donc le 0 == ( x ^ 0x1 )
l'expression au niveau binaire :
what? xxxxxxxx (8 bits)
xor 00000001 (hex 0x1 or 0x01, decimal 1)
gives 00000000
---------------------------
the only answer is 00000001
donc :
0 == ( x ^ 0x1 ) => x == 1
0 != ( x ^ 0x1 ) => x != 1
Il s'agit de l'opérateur OU exclusif (XOR). Pour comprendre comment il fonctionne, vous pouvez exécuter ce code simple
std::cout << "0x0 ^ 0x0 = " << ( 0x0 ^ 0x0 ) << std::endl;
std::cout << "0x0 ^ 0x1 = " << ( 0x0 ^ 0x1 ) << std::endl;
std::cout << "0x1 ^ 0x0 = " << ( 0x1 ^ 0x0 ) << std::endl;
std::cout << "0x1 ^ 0x1 = " << ( 0x1 ^ 0x1 ) << std::endl;
La sortie sera
0x0 ^ 0x0 = 0
0x0 ^ 0x1 = 1
0x1 ^ 0x0 = 1
0x1 ^ 0x1 = 0
Donc cette expression
0 != ( x ^ 0x1 )
sera égal à vrai seulement lorsque x != 0x1.
Il ne modifie pas x lui-même. Elle vérifie seulement si x est égal à 0 ou 1. Cette rxpression pourrait être modifiée en
if ( x != 0x1 )
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.