Java에서 "논리적 배타적"연산자 만들기


274

관찰 :

Java에는 논리 AND 연산자가 있습니다.
Java에는 논리 OR 연산자가 있습니다.
Java에는 논리 NOT 연산자가 있습니다.

문제:

sun에 따르면 Java에는 논리적 XOR 연산자가 없습니다 . 하나를 정의하고 싶습니다.

분석법 정의 :

방법으로 간단히 다음과 같이 정의됩니다.

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


메소드 호출 :

이 메소드는 다음과 같은 방식으로 호출됩니다.

boolean myVal = logicalXOR(x, y);


운영자 사용법 :

나는 오히려 다음과 같이 사용되는 연산자를 원할 것입니다.

boolean myVal = x ^^ y;


질문:

Java에서 새 연산자를 정의하는 방법에 대한 정보가 없습니다. 어디서부터 시작해야합니까?


1
뭐? 당신이 준 링크는 '비트 배타적 OR'내용이
매튜 P. 존스

C ++에서와 같이 Java로 연산자를 정의 할 수 있는지 궁금하십니까?
avgvstvs

1
&와 &&의 차이점을 오해 한 것 같습니다. 둘 다 논리 연산자 (부울)입니다. Starblue의 답변이 더 광범위하게 적용됩니다.
Vlasec

가 아닌해서 튜토리얼 , 자바를하지 않는 것을 의미하지 않는다 - 자습서는하지 (항상) 완료됩니다. 참조 Java 언어 사양 15.22.2
user85421

5
그것은라고 !=불리는 논리적 XNOR도있다,==
마크 K 코완

답변:


695

Java 에는 논리적 XOR 연산자 가 있으며 ^는 (와 같이 a ^ b)입니다.

그 외에도 Java로 새 연산자를 정의 할 수 없습니다.

편집 : 예는 다음과 같습니다.

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

산출:

거짓 ^ 거짓 = 거짓
거짓 ^ 참 = 참
참 ^ 거짓 = 참
참 ^ 참 = 거짓

5
이것은 내 게시물을 쓸 때도 기억을 벗어 났지만 ^를 논리 연산자 (및 비트 단위)로 사용할 수 있다고 생각합니다.
Neil Coffey

144
^는 비트 연산자 일뿐입니다. 논리 연산자이기도합니다. ^ 연산자가 과부하되었습니다. 정수 유형 또는 부울 유형에서 작동합니다. 좋은 답변 javashlook +1. 에디, 그것은 JLS 15.22.2 절, "부울 논리 연산자 &, ^, |"보다 명확하지 않다.
erickson

97
물론 대답은 &&와 ||입니다. 식의 두 번째 부분 평가를 건너 뛰고 & 및 | 항상 JLS를 읽음으로써 표현식의 두 부분을 모두 평가합니다. ^^는 정의에 따라 항상 두 부분을 모두 평가해야하므로 ^와 동일하게 동작합니다. 아마도 ^^이없는 이유
Eddie

81
@ 에디 : 그와 ^^ 그냥 이모티콘처럼 보인다.
Michael Myers

5
어쩌면 그것은 의미론의 문제 일지 모르지만 XOR과 관련하여 비트 및 논리는 동일한 결과를 산출합니다. 따라서 별개의 연산자가 필요하지 않습니다. XOR 연산자의 단순화 된 진리표는 X ^! X = 1입니다. 입력이 다른지 여부를 판별해야하기 때문에 XOR에서 입력을 단락시킬 수 없습니다. 실제 XOR 게이트의 제작을 알고 있으면 이해하기가 훨씬 쉽습니다.
hfontanez

305

x! = y 아닙니까?


5
x와 y가 부울 인 경우 xor와! =의 논리 테이블은 동일합니다. t, t => f; t, f => t; f, t => t; f, f => f
Greg 사례

81
Maurice : Arrgh 당신은 단지 내 마음을 날려 버렸다! 나는 이것을 어떻게 알지 못했습니까?

8
@Milhous 당신은 a != b != c작동하지 않을 것이라고 말하고 a ^ b ^ c있습니까? 이 경우, 당신은 잘못 입니다.
fredoverflow

3
모리스, 그냥 화려한! :) 할 수있는 많은있을 때 시야에서 간단한 일을 잃고 나에게 일어나는
sberezin

6
이 approch에서 붕괴 양측이 래퍼 클래스 때, new Boolean(true) != new Boolean(true)제공합니다 true.
Vlastimil Ovčáčík

74

Java에는 논리 AND 연산자가 있습니다.
Java에는 논리 OR 연산자가 있습니다.

잘못된.

자바는

  • 두 개의 논리 AND 연산자 : 정상 AND는 & 및 단락 AND는 &&이며
  • 두 개의 논리 OR 연산자 : 정상 OR은 | 단락 OR은 ||입니다.

단락 평가가 불가능하기 때문에 XOR은 ^로만 존재합니다.


2
재미있는 의견. 문서화되어 있습니까?
user666412

1
나는 생각하고 & | 비트 연산자이므로 단락되지 않습니다. 실제로 단락시킬 수는 없습니다.
Krzysztof Jabłoński

3
@Krzysztof Jabłoński 숫자에 대한 비트 연산자이지만 여기서는 부울 식에 대해 이야기하고 있습니다.
starblue

3
@ user666412 예. Java 언어 사양 (다른 곳)?
starblue

18
2 개의 AND 연산자와 2 개의 OR 연산자가 있으면 'Java에 논리 AND 연산자가 있습니다'및 'Java에 논리 OR 연산자가 있습니다'라는 명령문이 잘못되지 않습니다. 정의에 따라 2 개가 있다면 1 개도 있습니다.
RyanfaeScotland 12

31

아마 당신은 사이의 차이를 오해 &하고 &&, ||| 바로 가기 운영자의 목적 &&||두 번째 피연산자가 평가 될 필요가 없습니다, 그래서 첫 번째 피연산자의 값이 결과를 결정 할 수 있다는 것입니다.

이는 두 번째 피연산자가 오류를 발생시키는 경우 특히 유용합니다. 예 :

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

그러나 XOR 을 사용하면 결과를 얻기 위해 항상 두 번째 피연산자를 평가해야합니다 ^.


20

당신은 단지 쓸 수 있습니다 (a!=b)

이것은와 같은 방식으로 작동합니다 a ^ b.


9

연산자 오버로딩은 의도적으로 언어에서 제외 된 부분이기 때문입니다. 그들은 문자열 연결로 약간 "속임수"를했지만 그 이상의 기능은 존재하지 않습니다.

(면책 조항 : Java의 마지막 2 주요 릴리스와 함께 작업하지 않았으므로 지금 있다면 매우 놀랄 것입니다)


5
C ++에서는 새 연산자를 정의 할 수 없습니다. 당신이 할 수있는 것은 오래된 것들에 새로운 의미를 부여하는 것입니다.
David Thornley

7

Java에서 유일하게 연산자 오버로드는 + on Strings입니다 ( JLS 15.18.1 문자열 연결 연산자 + ).

공동체는 수년간 3으로 나뉘어졌으며 1/3은 원하지 않고 1/3은 원하지 않으며 1/3은 신경 쓰지 않습니다.

유니 코드를 사용하여 기호 인 메소드 이름을 작성할 수 있습니다. 따라서 사용하려는 기호가 있으면 myVal = x. $ (y); 여기서 $는 기호이고 x는 프리미티브가 아닙니다.하지만 일부 편집기에서는 피할 수 없으며 프리미티브에서 수행 할 수 없으므로 제한적입니다.


7

다음 코드 :

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

불필요한입니다.

쓰지 않는 이유 :

public static boolean logicalXOR(boolean x, boolean y) {
    return x != y;
}

?

또한 javashlook이 말했듯 이 이미 ^연산자가 있습니다.

!=^작업은 동일하지만 다르게 정수 피연산자, 부울 피연산자 (귀하의 경우)에 대한 *.

* 주 :
1. 이들은 boolean(기본 유형)에 동일하게 작동 하지만 Boolean(오브젝트 유형) 피연산자는 작동 하지 않습니다 . 로 Boolean(오브젝트 유형) 값 값을 가질 수있다 null. 그리고 !=반환 false또는 true피연산자 중 하나 또는 둘 때 null, 동안이 ^발생합니다 NullPointerException이 경우.
그들은 동일하게 작동하지만 함께 사용하면 2, 그들은 예를 들어 서로 다른 우선 순위를 가지고 &: a & b != c & d로 처리됩니다 a & (b != c) & d동안 a & b ^ c & d으로 처리됩니다 (a & b) ^ (c & d)(: 아야, C 스타일의 우선 순위 테이블 짜증 논외가).


1
부울 값이 마음에 들면!=
GKalnytskyi

1
Boolean값에 대한 @GKalnytskyi !=가 잘못 작동합니다. 들어 boolean값 괜찮아요.
vadipp

2
부울 피연산자에 대해 ! =와 ^는 동일하게 작동하지 않습니다 . 우선 순위 때문에 "false & false! = true"와 "false & false ^ true"에 대해 다른 결과가 표시됩니다.
Albert Hendriks

1
@AlbertHendriks, 나는 그들이 똑같이 작동 하지만 우선 순위 가 다르다고 말하고 싶습니다 (단지 용어의 문제 일뿐입니다).
사샤

6

다음은 Java 용 var arg XOR 메소드입니다 ...

public static boolean XOR(boolean... args) {
  boolean r = false;
  for (boolean b : args) {
    r = r ^ b;
  }
  return r;
}

즐겨


이것은 매우 이상한 행동을하게 될 것 같습니다. 예를 들어 XOR(true,true,true)true를 반환합니다 XOR. 이 메서드는라는 메서드에서 기대하지 않는 것 같습니다 . 예상되는 동작은 항상 false를 반환하는 것입니다 (물론 도움이되지 않음)
Richard Tingle

4

논리 배타적 또는 Java의 이름은 !=입니다. ^친구를 혼동하려는 경우 에도 사용할 수 있습니다 .


2

당신은 사용할 수 있습니다 Xtend (중위 연산자와 연산자 오버로딩을) 과부하 사업자 및 자바 '숙박'에


Xtend를 사용하면 캐럿을 재정의 할 수 없습니다 ^. 를 사용해야합니다 bool_1.xor(bool_2). 이상하게도 파서는 캐럿 을 사용할 수 없습니다 . xor부울과 bitwiseXor정수에 사용해야합니다 . 물론 다른 운영자에게 과부하를 줄 수 있지만 매우 혼란 스러울 수 있습니다.
Kelvin

2

당신이 요구하는 것은별로 이해가되지 않습니다. 내가 틀린 경우가 아니라면 AND 및 OR과 같은 방식으로 XOR을 사용하여 논리 연산을 수행 할 것을 제안합니다. 제공 한 코드는 실제로 내가 무엇을 의미하는지 보여줍니다.

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

함수에 부울 입력이 있으며 비트 XOR을 부울에 사용하면 결과는 제공 한 코드와 같습니다. 다시 말해, 비트 별 XOR은 개별 비트 (부울)를 비교하거나 개별 비트를 더 큰 값으로 비교할 때 이미 효율적입니다. 이것을 문맥에두기 위해, 이진 값의 관점에서, 0이 아닌 값은 참이고 ZERO 만 거짓입니다.

따라서 XOR이 논리 AND가 적용되는 것과 같은 방식으로 적용 되려면 하나의 비트 만 사용하는 이진 값만 사용하거나 (같은 결과와 효율성을 제공함) 이진 값은 비트 당이 아닌 전체로 평가되어야합니다. 즉, (010 ^^ 110) = 100 대신 (010 ^^ 110) = FALSE 식입니다. 이는 연산에서 의미 적 의미의 대부분을 제거하며 어쨌든 사용해서는 안되는 논리적 테스트를 나타냅니다.


1

!와 xor를 동일하게 만들려면 진리표가 동일하게 보이도록 A와 B가 부울 값이어야합니다. ! (A == B) lol을 사용할 수도 있습니다.


1

매우 인기있는 클래스 "org.apache.commons.lang.BooleanUtils"를 사용하고 있습니다.

이 방법은 많은 사용자에 의해 테스트되었으며 안전합니다. 즐기세요 용법:

boolean result =BooleanUtils.xor(new boolean[]{true,false});

0

부울 데이터 유형은 정수처럼 저장되므로 비트 연산자 ^는 부울 값과 함께 사용되는 경우 XOR 연산과 같은 기능을합니다.

//©Mfpl - XOR_Test.java

    public class XOR_Test {
        public static void main (String args[]) {
            boolean a,b;

            a=false; b=false;
            System.out.println("a=false; b=false;  ->  " + (a^b));

            a=false; b=true;
            System.out.println("a=false; b=true;  ->  " + (a^b));

            a=true;  b=false;
            System.out.println("a=true;  b=false;  ->  " + (a^b));

            a=true; b=true;
            System.out.println("a=true; b=true;  ->  " + (a^b));

            /*  output of this program:
                    a=false; b=false;  ->  false
                    a=false; b=true;  ->  true
                    a=true;  b=false;  ->  true
                    a=true; b=true;  ->  false
            */
        }
    }

0

예를 들면 다음과 같습니다.

2 개의 int 값이 주어지면 하나가 음수이고 하나가 양수이면 true를 리턴합니다. "negative"매개 변수가 true 인 경우를 제외하고 둘 다 음수 인 경우에만 true를 리턴하십시오.

    public boolean posNeg(int a, int b, boolean negative) {
      if(!negative){
        return (a>0 && b<0)^(b>0 && a<0);
      }
      else return (a<0 && b<0);
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.