Как сделать логическое исключительное или?

#f#

#f#

Вопрос:

По-видимому, не существует логической версии побитового оператора исключающего или (^^^) … что делать?

Ответ №1:

Это обеспечивается оператором not-equal <> .

Комментарии:

1. Хорошо. Я в тупике. Как происходит <> замена логического xor?

2. <> имеет значение True, когда входные данные разные, и False, когда входные данные одинаковы. Это именно то, что делает операция xor.

3. Конечно! Я спросил это слишком поспешно. Заставляет задуматься, почему в C # это есть. В F # одно небольшое отличие, которое сделал бы оператор xor, заключается в том, что его операнды имеют тип bool .

4. Дой, да, это работает, спасибо. Но я вижу, что использование <> результатов в компиляторе F # выдает что-то вроде call x; call y; ceq; ldc.i4.0; ceq , в то время как компилятор C # будет выдавать call x; call y; xor for ^ … Интересно, есть ли там (микро) последствия для производительности.

5. Можно выдать xor инструкцию, используя встроенный IL, но эта функция устарела, и они сказали нам, что намерены удалить ее в следующей версии: let inline xor (x:bool) (y:bool) = (# "xor" x y : bool #)

Ответ №2:

 let inline xor a b = (a || b) amp;amp; not (a amp;amp; b)
  

Комментарии:

1. Почему встроенный, если известно, что тип bool ? Также почему нет let xor a b = if a then not b else b или даже let xor a b = a <> b ?