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;
}
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;
}
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;
}
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)
Vous pouvez effectuer une opération au niveau du bit XOR dans c en utilisant l'opérateur ^
.
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 ~
.