[c#] 조건부 XOR?

C #에 조건부 XOR연산자 가없는 이유는 무엇입니까?

예:

true  xor false = true
true  xor true  = false
false xor false = false



답변

C #에서 조건부 연산자는 필요한 경우 에만 보조 피연산자를 실행 합니다 .

XOR 정의에 따라 두 값을 모두 테스트 해야 하므로 조건부 버전은 어리석은 것입니다.

:

  • 논리적 AND : &-매번 양쪽을 테스트합니다.

  • 논리적 OR : |-매번 양쪽을 테스트합니다.

  • 조건부 AND : &&-첫 번째면이 참인 경우 두 번째 면만 테스트합니다.

  • 조건부 OR : ||-첫 번째면이 거짓이면 두 번째 면만 테스트합니다.


답변

질문이 조금 구식이지만 …

이 연산자가 작동하는 방식은 다음과 같습니다.

true xor false = true
true xor true = false
false xor true = true
false xor false = false

다음은! = 연산자가 bool 유형에서 작동하는 방식입니다.

(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false

보시다시피 ^^존재하지 않는 것은 기존의!=


답변

논리 XOR 연산자가 있습니다. ^

문서 : C # 연산자^ 연산자


답변

설명처럼 ^ 연산자는 정수 유형과 부울 모두에서 작동합니다.

참조 MSDN의 ^ 연산자 (C # 참조) :

이진 ^ 연산자는 정수 유형 및 부울에 대해 사전 정의됩니다. 정수 유형의 경우 ^는 피연산자의 비트 배타적 OR을 계산합니다. bool 피연산자의 경우 ^는 피연산자의 논리적 배타적 또는 논리 연산을 계산합니다. 즉, 피연산자 중 정확히 하나가 참인 경우에만 결과가 참입니다.

이 질문이 제기 된 2011 년 이후로 문서가 변경되었을 수 있습니다.


답변

Mark L의 질문에 따라 올바른 버전은 다음과 같습니다.

 Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));

다음은 진리표입니다.

 X | Y | Result
 ==============
 0 | 0 | 0
 1 | 0 | 1
 0 | 1 | 1
 1 | 1 | 0

참조 :
독점 OR


답변

네, 그렇습니다.

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;


답변

조건부 xor는 존재하지 않지만 xor가 부울에 대해 정의되고 모든 조건부 비교가 부울로 평가되므로 논리 xor를 사용할 수 있습니다.

따라서 다음과 같이 말할 수 있습니다.

if ( (a == b) ^ (c == d))
{

}