Ви не реалізуєте логічний затвор лише тому, що він має функціональну повноту, особливо якщо інші логічні ворота є наявними. Ви реалізуєте те, що зазвичай використовується компіляторами.
NAND, NOR і XNOR дуже рідко потрібні. Крім класичних побітових операторів AND, OR і XOR, практична корисність матиме лише ANDN ( ~a & b
), який не є NAND ( ~(a & b)
). Якщо такі є, ЦП повинен це реалізувати (і справді деякі ЦП реалізують ANDN).
Для пояснення практичної корисності ANDN уявіть, що у вас є бітова маска, яка використовує багато біт, але вас цікавлять лише деякі з них, які є наступними:
enum my_flags {
IT_IS_FRIDAY = 1,
...
IT_IS_WARM = 8,
...
THE_SUN_SHINES = 64,
...
};
Зазвичай ви хочете перевірити, чи є ваші інтереси до бітмаски чи
- Вони всі налаштовані
- Принаймні один встановлений
- Принаймні один не встановлений
- Жоден не встановлений
Почнемо зі збору ваших цікавих місць:
#define BITS_OF_INTEREST (IT_IS_FRIDAY | IT_IS_WARM | THE_SUN_SHINES)
1. Встановлюються всі інтереси: побіжно ANDN + логічно НЕ
Скажімо, ви хочете знати, чи всі ваші інтереси встановлені. Ви можете бачити це як (my_bitmask & IT_IS_FRIDAY) && (my_bitmask & IT_IS_WARM) && (my_bitmask & THE_SUN_SHINES)
. Однак, як правило, ви впадете в це
unsigned int life_is_beautiful = !(~my_bitmask & BITS_OF_INTEREST);
2. Принаймні один біт інтересу встановлюється: порозрядне І
Тепер скажемо, що ви хочете дізнатися, чи встановлений хоча б один інтерес. Ви можете бачити це як (my_bitmask & IT_IS_FRIDAY) || (my_bitmask & IT_IS_WARM) || (my_bitmask & THE_SUN_SHINES)
. Однак, як правило, ви впадете в це
unsigned int life_is_not_bad = my_bitmask & BITS_OF_INTEREST;
3. Принаймні один інтерес не встановлюється: розрядне ANDN
Тепер скажімо, що ви хочете знати, якщо хоча б один інтерес не встановлений. Ви можете бачити це як !(my_bitmask & IT_IS_FRIDAY) || !(my_bitmask & IT_IS_WARM) || !(my_bitmask & THE_SUN_SHINES)
. Однак, як правило, ви впадете в це
unsigned int life_is_imperfect = ~my_bitmask & BITS_OF_INTEREST;
4. Ніякий інтерес не встановлюється: побіжно І + логічно НЕ
Тепер скажемо, що ви хочете знати, чи не встановлені всі інтереси . Ви можете бачити це як !(my_bitmask & IT_IS_FRIDAY) && !(my_bitmask & IT_IS_WARM) && !(my_bitmask & THE_SUN_SHINES)
. Однак, як правило, ви впадете в це
unsigned int life_is_horrible = !(my_bitmask & BITS_OF_INTEREST);
Це звичайні операції, що виконуються на бітовій масці, плюс класичні побітові АБО та XOR. Я думаю , однак , що мова (який не є центральним процесором ) повинен включати в себе побітовое NAND, NOR і оператори XNOR (символи яких були б ~&
, ~|
а ~^
), незважаючи на рідко. Я б не включав оператора ANDN в мову, оскільки, оскільки це не комутативно ( a ANDN b
не те саме, що b ANDN a
) - краще писати ~a & b
замість a ANDN b
, колишній чіткіше демонструє асиметрію операції.