[java] 부울 검사에 xor 연산자를 사용하는 것이 좋습니다? [닫은]

나는 개인적으로 같은 독점 또는 , ^이 때문에 간결의 여부를 확인의 맥락에서 의미가, 연산자. 나는 글 쓰는 것을 훨씬 좋아한다

if (boolean1 ^ boolean2)
{
  //do it
}

…보다

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

그러나 나는 종종 초보자뿐만 아니라 다른 숙련 된 Java 개발자들로부터 혼란스러워 보이고 때로는 비트 연산에만 사용해야하는 방법에 대한 의견을 얻습니다.

^운영자 의 사용에 관한 모범 사례에 대해 궁금합니다 .



답변

!=대신 간단하게 사용할 수 있습니다 .


답변

나는 당신이 당신의 자신의 질문에 대답했다고 생각합니다-사람들로부터 이상한 외모를 얻는다면 더 명확한 옵션을 사용하는 것이 더 안전합니다.

주석을 달아야 할 경우 더 자세한 버전으로 바꾸고 사람들이 처음에 질문하지 않도록하는 것이 좋습니다.


답변

비슷한 대화를 많이하는 것으로 나타났습니다. 한편으로는 목표를 달성하는 작고 효율적인 방법이 있습니다. 반면에, 당신은 다른 팀원들이 이해할 수없는 것을 가지고 있기 때문에, 미래에 유지하기가 어렵습니다.

나의 일반적인 규칙은 사용되는 기술이 프로그래머가 일반적으로 알기를 기대하는 것이 합리적인지 묻는 것입니다. 이 경우 프로그래머가 부울 연산자를 사용하는 방법을 알고 있으므로 if 문에 xor를 사용하는 것이 좋습니다.

좋지 않은 것의 예로서, xor를 사용하여 임시 변수를 사용하지 않고 두 변수를 교환하는 트릭을 가져 가십시오. 그것은 모두가 익숙하지 않을 것이라고 생각하는 트릭이므로 코드 검토를 통과하지 못합니다.


답변

예를 들어 댓글을 달면 괜찮을 것 같습니다 // ^ == XOR.


답변

항상 함수로 감싸서 자세한 이름을 지정할 수 있습니다.

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

그러나 ^ 연산자가 무엇인지 Google에 대해 정말로 알지 못하는 사람에게는 어렵지 않을 것 같습니다. 처음으로 기억하기 어렵지 않습니다. 다른 용도를 요청 했으므로 비트 마스킹에 XOR을 사용하는 것이 일반적입니다.

XOR을 사용하여 세 번째 임시 변수를 사용하지 않고 두 변수의 값을 바꿀 수도 있습니다 .

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

다음은 XOR 스와핑과 관련된 Stackoverflow 질문 입니다.


답변

나는 최근에 직장에서 JavaScript 프로젝트에서 xor를 사용하여 무슨 일이 있었는지 설명하기 위해 7 줄의 주석추가 했습니다. 그 상황에서 배타적 사용을위한 정당성 (용어의 하나 term1없는 두하지만 세 가지 값을 취할 수에 아래의 예) undefined, true또는 false다른 상태 ( term2) 일 수 true또는 false. 나는에 대한 추가 검사를 추가해야했습니다 undefined경우 만 XOR로, 다음은 첫 학기 첫 번째 부울로 평가되는 XOR 힘 때문에셔서 충분했다 undefined로 취급받을 false:

if (term1 ^ term2) { ...

결국 약간의 과잉 이었지만 어쨌든 일종의 이스터 에그로 보관하고 싶었습니다.


답변

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it 
} 

이 코드는 IMHO 단순화 될 수 있습니다 :

if(boolean1 != boolean2)
{
  //do it 
}