Sie implementieren ein Logikgatter nicht, nur weil es funktionsfähig ist, insbesondere wenn die anderen Logikgatter nativ verfügbar sind. Sie implementieren, was von Compilern am häufigsten verwendet wird.
NAND, NOR und XNOR werden sehr selten benötigt. Neben den klassischen bitweisen Operatoren AND, OR und XOR hätte nur ANDN ( ~a & b
) - das nicht NAND ( ~(a & b)
) ist - einen praktischen Nutzen. Wenn überhaupt, sollte eine CPU dies implementieren (und tatsächlich implementieren einige CPUs ANDN).
Stellen Sie sich zum Erläutern des praktischen Nutzens von ANDN vor, Sie hätten eine Bitmaske, die viele Bits verwendet, aber Sie interessieren sich nur für einige der folgenden:
enum my_flags {
IT_IS_FRIDAY = 1,
...
IT_IS_WARM = 8,
...
THE_SUN_SHINES = 64,
...
};
Normalerweise möchten Sie in der Bitmaske überprüfen, ob Ihre Bits von Interesse sind
- Sie sind alle eingestellt
- Mindestens einer ist gesetzt
- Mindestens einer ist nicht gesetzt
- Keiner ist gesetzt
Fangen wir an, indem wir Ihre Interessen zusammenfassen:
#define BITS_OF_INTEREST (IT_IS_FRIDAY | IT_IS_WARM | THE_SUN_SHINES)
1. Alle Bits von Interesse werden gesetzt: bitweises ANDN + logisches NOT
Nehmen wir an, Sie möchten wissen, ob Ihre Interessen in Ordnung sind. Sie können es so sehen (my_bitmask & IT_IS_FRIDAY) && (my_bitmask & IT_IS_WARM) && (my_bitmask & THE_SUN_SHINES)
. Jedoch normalerweise würden Sie das in zusammenbrechen
unsigned int life_is_beautiful = !(~my_bitmask & BITS_OF_INTEREST);
2. Mindestens ein Bit von Interesse ist gesetzt: bitweises UND
Nehmen wir nun an, Sie möchten wissen, ob mindestens ein Bit von Interesse gesetzt ist. Sie können es als sehen (my_bitmask & IT_IS_FRIDAY) || (my_bitmask & IT_IS_WARM) || (my_bitmask & THE_SUN_SHINES)
. Jedoch normalerweise würden Sie das in zusammenbrechen
unsigned int life_is_not_bad = my_bitmask & BITS_OF_INTEREST;
3. Mindestens ein Bit von Interesse ist nicht gesetzt: Bitweises ANDN
Angenommen, Sie möchten wissen, ob mindestens ein Bit von Interesse nicht gesetzt ist. Sie können es als sehen !(my_bitmask & IT_IS_FRIDAY) || !(my_bitmask & IT_IS_WARM) || !(my_bitmask & THE_SUN_SHINES)
. Jedoch normalerweise würden Sie das in zusammenbrechen
unsigned int life_is_imperfect = ~my_bitmask & BITS_OF_INTEREST;
4. Es ist kein interessierendes Bit gesetzt: Bitweises UND + logisches NICHT
Nun lassen Sie uns sagen , dass Sie , wenn alle Bits von Interesse wissen wollen , sind nicht festgelegt. Sie können es als sehen !(my_bitmask & IT_IS_FRIDAY) && !(my_bitmask & IT_IS_WARM) && !(my_bitmask & THE_SUN_SHINES)
. Jedoch normalerweise würden Sie das in zusammenbrechen
unsigned int life_is_horrible = !(my_bitmask & BITS_OF_INTEREST);
Dies sind die üblichen Operationen, die mit einer Bitmaske ausgeführt werden, sowie das klassische bitweise ODER und XOR. Ich glaube aber , dass eine Sprache (was nicht ist eine CPU ) sollte das bitweise NAND umfassen, NOR und XNOR Operatoren (deren Symbole wäre ~&
, ~|
und ~^
), obwohl nur selten verwendet. Ich würde nicht den ANDN Operator in einer Sprache , obwohl enthalten, da es nicht kommutativ ist ( a ANDN b
ist nicht das gleiche wie b ANDN a
) - besser zu schreiben ~a & b
statt a ANDN b
, die ehemaligen zeigt deutlicher die asimmetry der Operation.