Создание логического эксклюзивного или оператора в Java
Замечания:
Java имеет логический оператор AND.
Java имеет логический оператор OR.
Java имеет логический оператор NOT.
Проблема:
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
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);
}
}
}
Вывод:
false ^ false = false
false ^ true = true
true ^ false = true
true ^ true = false
Ответ 2
Разве это не x!= y?
Ответ 3
Java имеет логический оператор И.
Java имеет логический оператор OR.
Неправильно.
Java имеет
- два логических оператора И: нормальный AND is и и короткое замыкание AND is & &, и
- два логических оператора OR: normal OR is | и короткое замыкание ИЛИ равно ||.
XOR существует только как ^, потому что оценка короткого замыкания невозможна.
Ответ 4
Возможно, вы неправильно поняли разницу между &
и &&
, |
и ||
Назначение операторов ярлыков &&
и ||
состоит в том, что значение первого операнда может определять результат, поэтому второй операнд не нужно оценивать.
Это особенно полезно, если второй операнд приведет к ошибке.
например.
if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)
Однако с XOR вам всегда нужно оценить второй операнд, чтобы получить результат, поэтому единственная значимая операция ^
.
Ответ 5
Вы можете просто написать (a!=b)
Это будет работать так же, как a ^ b
.
Ответ 6
Это потому, что перегрузка оператора - это то, что они специально упускают из языка преднамеренно. Они "обманули" бит с конкатенацией строк, но помимо этого таких функций не существует.
(отказ от ответственности: я не работал с последними 2-мя главными версиями java, поэтому, если это сейчас, я буду очень удивлен)
Ответ 7
Единственная перегрузка оператора в Java - + на строках (JLS 15.18.1 Оператор конкатенации строк +).
Сообщество было разделено на 3 года, 1/3 не хочет этого, 1/3 его хочет, а 1/3 не волнует.
Вы можете использовать unicode для создания имен методов, которые являются символами... поэтому, если у вас есть символ, который вы хотите использовать, вы можете сделать myVal = x. $(y); где $- символ, а x не является примитивным... но это будет изворотливым в некоторых редакторах и является предельным, поскольку вы не можете сделать это на примитиве.
Ответ 8
Вот метод var arg XOR для java...
public static boolean XOR(boolean... args) {
boolean r = false;
for (boolean b : args) {
r = r ^ b;
}
return r;
}
Enjoy
Ответ 9
Следующий код:
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 сказал, уже существует оператор ^
.
!=
и ^
работают тождественно для булевых операндов (ваш случай), но по-разному для целых операндов.
Ответ 10
Вы можете использовать Xtend (Операторы Infix и перегрузка операторов), чтобы перегрузить операторы и "остаться" на Java
Ответ 11
То, о чем вы просите, не имеет большого смысла. Если я не прав, вы предполагаете, что хотите использовать XOR для выполнения логических операций так же, как AND и OR. Ваш предоставленный код на самом деле показывает, что я предлагаю:
public static boolean logicalXOR(boolean x, boolean y) {
return ( ( x || y ) && ! ( x && y ) );
}
В вашей функции есть логические входы, и когда побитовое XOR используется на логических значениях, результат будет таким же, как и код, который вы предоставили. Другими словами, побитовое XOR уже эффективно при сравнении отдельных битов (булево) или сравнении отдельных битов в больших значениях. Чтобы поместить это в контекст, в терминах двоичных значений любое ненулевое значение TRUE, и только ZERO является ложным.
Итак, для того, чтобы XOR применялся так же, как и логический И применяется, вы либо использовали бы двоичные значения только с одним битом (с тем же результатом и эффективностью), либо двоичное значение должно было бы оцениваться как целое, а не за бит. Другими словами, выражение (010 ^^ 110) = FALSE вместо (010 ^^ 110) = 100. Это позволит удалить большую часть семантического значения из операции и представляет собой логический тест, который вы не должны использовать в любом случае.
Ответ 12
A и B должны быть логическими значениями, чтобы сделать!= то же, что и xor, чтобы таблица истинности выглядела одинаково. Вы также можете использовать! (A == B) lol.
Ответ 13
Я использую очень популярный класс "org.apache.commons.lang.BooleanUtils"
Этот метод проверяется многими пользователями и безопасен. Повеселись.
Использование:
boolean result =BooleanUtils.xor(new boolean[]{true,false});
Ответ 14
Поскольку тип булевых данных хранится как целое число, оператор бит ^ функционирует подобно операции 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
*/
}
}
Ответ 15
Вот пример:
Учитывая 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);
}
Ответ 16
вам нужно переключиться на Scala, чтобы реализовать свои собственные операторы
пример трубы