Почему много языков испытывает недостаток в логическом операторе XOR?

В целом нет никакой потребности к несуществующим объектам после использования, но в некоторых случаях я нахожу, что это - хорошая практика.

, Если объект реализует IDisposable и хранится в поле, я думаю, что хорошо аннулировать его, только избегать использования склонного объекта. Ошибки следующего вида могут быть болезненными:

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

хорошо аннулировать поле после расположения его и разобраться в NullPtrEx в строке, где поле используется снова. Иначе Вы могли бы столкнуться с некоторой загадочной ошибкой по линии (в зависимости от точно, что DoSomething делает).

11
задан Jeffrey Aylesworth 9 December 2009 в 22:32
поделиться

6 ответов

Итак, вы ищете байт с умным исключающим ИЛИ по сравнению с битом с умным исключающим ИЛИ. Похоже, вы ищете что-то, что будет работать с байтом как «включено» или «выключено», так как считалось, что байты равны «0» или «ненулевые», а затем XOR их. Похоже, вы хотите сжать каждый байт в один бит, указывающий истину или ложь. Итак, похоже, вы хотите (a! = 0) ^ (b! = 0)

 a  b    a YOURXOR b    a!=0   b!=0   (a!=0)^(b!=0)
 0  0         0          0       0        0        
 0  1         1          0       1        1
 1  0         1          1       0        1
 7  0         1          1       0        1
 0  7         1          0       1        1
 3  7         0          1       1        0
 7  3         0          1       1        0
 7  7         0          1       1        0

Что касается того, почему это не на всех языках ... я не могу ответить. Однако это не так уж и сложно реализовать с помощью строительных блоков побитового xor, доступного на каждом языке, и ни один язык не предлагает все возможные функции - они просто предлагают достаточно, чтобы позволить вам создавать расширенные функции, которые могут вам понадобиться. Ой, и если бы это была достаточно популярная проблема, вы бы ожидали увидеть повсюду библиотеки или макросы для ее решения; хотя я, возможно, не произвел достаточного поиска таких библиотек / кода, я сам их не нашел, что указывает на то, что это требование либо тривиально для написания, либо является нишевым требованием.

3
ответ дан 3 December 2019 в 01:44
поделиться

Почти на всех языках имеет логический XOR. Символы, которые они используют для этого, различаются, но независимо от символа большинство людей произносят его «не равно».

Редактировать: для тех, кто сомневается, тестовый код для трех переменных:

#include <iostream>

int main() { 
    for (int i=0; i<2; i++)
        for (int j=0; j<2; j++)
            for (int k=0; k<2; k++) {
                std::cout << "\n!=" << (i!=j!=k);
                std::cout << "\t^ " << (i^j^k);
            }
    return 0;
}
19
ответ дан 3 December 2019 в 01:44
поделиться

Что вы подразумеваете под «логическим оператором XOR»? Я не уверен, какой результат вы ожидаете от своих примеров, но вот мой ответ:

a (логический XOR) b то же самое, что bool (a)! = Bool (b)

Неравенство - это логическая операция XOR. Поскольку у вас уже есть версия побитового XOR, вам не нужен специальный оператор для логического.

6
ответ дан 3 December 2019 в 01:44
поделиться

Вероятно потому, что XOR обычно не требуется в качестве логического оператора, и вы можете сделать это почти так же легко, как это:

// foo xor bar
(foo & !bar) || (bar & !foo)

// or like this (assuming foo and bar are booleans)
!(foo==bar)

// assume boleans that can be cast as integers with true=1 and false=0
// foo XOR bar XOR baz XOR alice
((int)foo + (int)bar + (int)baz + (int)alice)&0b1
1
ответ дан 3 December 2019 в 01:44
поделиться

Единственная причина, по которой я могу думать, это то, что операция выполняется относительно редко. Я не понимаю, почему ему нельзя было присвоить что-то вроде ^^, возможно, люди, которые разрабатывают языки, хотят избежать беспорядка с операторами.

Что касается его бесполезности, потому что его нельзя замкнуть накоротко, во многих Строго типизированные языки, вы не можете использовать побитовый оператор XOR для сравнения логических значений без преобразования вперед и назад, и в этом случае имеет смысл использовать даже логический XOR без короткого замыкания.

3
ответ дан 3 December 2019 в 01:44
поделиться

Вы также можете написать !a ^ !b, чтобы получить тот же эффект, что и логический xor.

Скорее всего, вы не найдете логический xor в языках программирования, потому что:

  • не очень эффективный ассемблерный код
  • не нужен очень часто
  • дизайнерам языков приходится ставить строку куда-то, почему бы и нет NAND, NOR, NXOR и т.д.
5
ответ дан 3 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: