IT

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

lottoking 2020. 3. 29. 09:14
반응형

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


관찰 :

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에서 새 연산자를 정의하는 방법에 대한 정보가 없습니다. 어디서부터 시작해야합니까?


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);
        }
    }
}

산출:

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

x! = y 아닙니까?


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

잘못된.

자바는

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

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


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

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

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

그러나 XOR 에서는 결과를 얻기 위해 항상 두 번째 피연산자를 평가해야하므로 유일한 의미있는 연산이 ^됩니다.


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

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


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

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


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

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

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


다음 코드 :

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 스타일의 우선 순위 테이블 짜증 논외가).


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

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

즐겨


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


당신이 요구하는 것은별로 이해가되지 않습니다. 내가 틀린 경우가 아니라면 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 식입니다. 이는 연산에서 의미 적 의미를 대부분 제거하고 어쨌든 사용해서는 안되는 논리적 테스트를 나타냅니다.


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


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


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

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

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

부울 데이터 유형은 정수처럼 저장되므로 비트 연산자 ^는 부울 값과 함께 사용되는 경우 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
            */
        }
    }

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

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);
    }

자신의 연산자를 구현하려면 스칼라로 전환해야합니다

파이프 예

참고 URL : https://stackoverflow.com/questions/726652/creating-a-logical-exclusive-or-operator-in-java

반응형