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
'IT' 카테고리의 다른 글
#if RELEASE가 ## DEBUG가 C #에서하는 것처럼 작동합니까? (0) | 2020.03.29 |
---|---|
이클립스 댓글 / 댓글 바로 가기? (0) | 2020.03.29 |
C #에서 문자열과 문자열의 차이점은 무엇입니까? (0) | 2020.03.29 |
Git에서 분기를 언제 삭제합니까? (0) | 2020.03.29 |
루비는 파이썬이 가지고 있지 않은 것과 그 반대의 것을 가지고 있습니까? (0) | 2020.03.29 |