web-dev-qa-db-fra.com

Comment faire un peu sage XOR en C

J'essaie d'entrer dans la programmation en C et j'ai du mal à écrire une fonction XOR au niveau du bit avec seulement les opérateurs ~ et &. Exemple: bitXor(4, 5) = 1. Comment puis-je atteindre cet objectif?

Jusqu'ici j'ai ceci:

int bitXor(int x, int y) {

    return z;
}
12
sebi

Eh bien, réfléchissons à cela. Que fait XOR?

x   y    XOR
------------
0   0     0
1   0     1
0   1     1
1   1     0

Alors, comment pouvons-nous transformer cela en une fonction? Pensons à AND, et à l'ordre inverse de AND (~ x & ~ y) (cela se trouve être NOR):

              (~x&~y)
 x   y   AND    NOR   
 ---------------------
 0 & 0  = 0      1    
 1 & 0  = 0      0 
 0 & 1  = 0      0
 1 & 1  = 1      0

En regardant ces deux sorties, c'est assez proche, il suffit de NOR les deux sorties précédentes (x AND y) (x NOR y) et nous aurions la solution! 

  (a)       (b)    ( a NOR b )
x AND y   x NOR y    ~a & ~b
-------------------------------
   0         1          0
   0         0          1
   0         0          1
   1         0          0

Maintenant, écrivez ça:

a = ( x & y )
b = ( ~x & ~y )
XOR'd result = (~a & ~b)

BINGO! Maintenant, écrivez cela dans une fonction

int bitXor(int x, int y) 
{
    int a = x & y;
    int b = ~x & ~y;
    int z = ~a & ~b;
    return z;
}     
35
Mike

Utilisation de NAND logic:

int bitNand(int x, int y)
{
    return ~ (x & y);
}

int bitXor(int x, int y)
{
    return bitNand( bitNand(x, bitNand(x, y)),
                    bitNand(y, bitNand(x, y)) );
}

Ou:

int bitXor(int x, int y)
{
    return ~( (x & y) | (~x & ~y) );
}

Ou:

int bitXor(int x, int y)
{
    return (x & ~y) | (~x & y);
}

Bien sûr, c'est plus facile:

int bitXor(int x, int y)
{
    return x ^ y;
}
26
David Schwartz

On voit facilement que

x ^ y = (x | y) & ~(x & y)

il reste donc à exprimer | uniquement par & et ~. Les lois de De Morgan nous disent

x | y = ~(~x & ~y)
8
Daniel Fischer

Vous pouvez effectuer une opération au niveau du bit XOR dans c en utilisant l'opérateur ^.

0
MVP

Je veux l'écrire seulement avec ~ et &

Cela compte pour les portes NAND, non? Après avoir étudié ce schéma circuit:

int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));

Il en va de même pour les non-bits, i. e. une logique aussi, il suffit de remplacer ! au lieu de ~.

0
user529758