183 votes

Que signifie (x ^ 0x1) != 0 ?

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 ?

277voto

Paul R Points 104036

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.

78voto

Violet Giraffe Points 5764

^ 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)

49voto

Jaroslaw Waliszko Points 6618

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

34voto

Vlad from Moscow Points 36219

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 )

19voto

fritzone Points 9925

Il vérifie que x n'est en fait pas 0x1 ... xor x avec 0x1 aura pour résultat 0 seulement si x est 0x1 ... il s'agit d'un vieux truc utilisé principalement en langage assembleur.

Prograide.com

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.

Powered by:

X