Vous n'implémentez pas une porte logique uniquement parce qu'elle a une fonctionnalité complète, en particulier si les autres portes logiques sont disponibles de manière native. Vous implémentez ce qui est le plus utilisé par les compilateurs.
NAND, NOR et XNOR sont très rarement nécessaires. Outre les opérateurs de bits classiques AND, OR et XOR, seul ANDN ( ~a & b
) - qui n'est pas NAND ( ~(a & b)
) - aurait une utilité pratique. Le cas échéant, un processeur doit implémenter cela (et certains processeurs implémentent également ANDN).
Pour expliquer l’utilité pratique d’ANDN, imaginez que vous disposiez d’un masque de masque utilisant de nombreux bits, mais que vous ne vous intéressiez qu’à certains d’entre eux, à savoir:
enum my_flags {
IT_IS_FRIDAY = 1,
...
IT_IS_WARM = 8,
...
THE_SUN_SHINES = 64,
...
};
Normalement, vous voulez vérifier si le bitmask vous intéresse,
- Ils sont tous ensemble
- Au moins un est réglé
- Au moins un n'est pas défini
- Aucun n'est défini
Commençons par rassembler vos éléments d’intérêt:
#define BITS_OF_INTEREST (IT_IS_FRIDAY | IT_IS_WARM | THE_SUN_SHINES)
1. Tous les bits d’intérêt sont définis: AND au niveau du bit + NOT logique
Disons que vous voulez savoir si vos éléments d’intérêt sont tous définis. Vous pouvez le voir comme (my_bitmask & IT_IS_FRIDAY) && (my_bitmask & IT_IS_WARM) && (my_bitmask & THE_SUN_SHINES)
. Cependant, normalement, vous réduiriez cela en
unsigned int life_is_beautiful = !(~my_bitmask & BITS_OF_INTEREST);
2. Au moins un bit d’intérêt est défini: bitwise ET
Maintenant, disons que vous voulez savoir si au moins un élément d’intérêt est défini. Vous pouvez le voir comme (my_bitmask & IT_IS_FRIDAY) || (my_bitmask & IT_IS_WARM) || (my_bitmask & THE_SUN_SHINES)
. Cependant, normalement, vous réduiriez cela en
unsigned int life_is_not_bad = my_bitmask & BITS_OF_INTEREST;
3. Au moins un bit d’intérêt n’est pas défini: bitwise ANDN
Maintenant, disons que vous voulez savoir si au moins un élément d’intérêt n’est pas défini. Vous pouvez le voir comme !(my_bitmask & IT_IS_FRIDAY) || !(my_bitmask & IT_IS_WARM) || !(my_bitmask & THE_SUN_SHINES)
. Cependant, normalement, vous réduiriez cela en
unsigned int life_is_imperfect = ~my_bitmask & BITS_OF_INTEREST;
4. Aucun bit d’intérêt n’est défini: bitwise AND + logique NOT
Maintenant, disons que vous voulez savoir si tous les éléments d’intérêt ne sont pas définis. Vous pouvez le voir comme !(my_bitmask & IT_IS_FRIDAY) && !(my_bitmask & IT_IS_WARM) && !(my_bitmask & THE_SUN_SHINES)
. Cependant, normalement, vous réduiriez cela en
unsigned int life_is_horrible = !(my_bitmask & BITS_OF_INTEREST);
Ce sont les opérations courantes effectuées sur un masque de bits, plus les OR classiques au niveau des bits et XOR. Je pense cependant qu'un langage (qui n'est pas un processeur ) devrait inclure les opérateurs au niveau du bit NAND, NOR et XNOR (dont les symboles seraient ~&
, ~|
et ~^
), bien qu'ils soient rarement utilisés. Cependant, je n'inclurais pas l'opérateur ANDN dans un langage, puisqu'il n'est pas commutatif (ce a ANDN b
n'est pas la même chose que b ANDN a
) - il est préférable d'écrire ~a & b
au lieu de a ANDN b
, l'ancien indique plus clairement l'asymétrie de l'opération.