Создание логического эксклюзивного или оператора в Java

Замечания:

Java имеет логический оператор И.
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. С чего начать?

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

Разве это не x! = Y?

Java имеет логический оператор И.
Java имеет логический оператор OR.

Неправильно.

Java имеет

  • два логических оператора AND: нормальный AND is & и короткое замыкание AND is &&, и
  • два логических оператора OR: normal OR is | и короткое замыкание OR равно ||.

XOR существует только как ^, потому что оценка короткого замыкания невозможна.

Возможно, вы неправильно поняли разницу между & и && , | и || Назначение операторов ярлыков && и || что значение первого операнда может определять результат, и поэтому второй операнд не нужно оценивать.

Это особенно полезно, если второй операнд приведет к ошибке. например

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

Однако с XOR вам всегда приходится оценивать второй операнд, чтобы получить результат, поэтому единственная значимая операция – ^ .

Вы можете просто написать (a!=b)

Это будет работать так же, как a ^ b .

Это связано с тем, что перегрузка операторов – это то, что они специально упускают из языка сознательно. Они «обманули» бит с конкатенацией строк, но помимо этого такой функции не существует.

(отказ от ответственности: я не работал с последними 2 основными выпусками java, поэтому, если он сейчас, я буду очень удивлен)

Единственная перегрузка оператора в Java – + на строках ( JLS 15.18.1 Оператор конкатенации строк + ).

Сообщество было разделено на 3 года, 1/3 не хочет этого, 1/3 его хотят, а 1/3 не волнует.

Вы можете использовать unicode для создания имен методов, которые являются символами … поэтому, если у вас есть символ, который вы хотите использовать, вы можете сделать myVal = x. $ (Y); где $ – символ, а х – не примитив … но это будет изворотливым в некоторых редакторах и является предельным, поскольку вы не можете сделать это на примитиве.

Следующий код:

 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 (object type) могут иметь значение null . И != Вернет false или true если один или оба его операнда равны null , а в этом случае ^ выкинет NullPointerException .
2. Хотя они работают одинаково, они имеют различный приоритет, например, при использовании с & : a & b != c & d будут рассматриваться как a & (b != c) & d , тогда как a & b ^ c & d будет обрабатываться как (a & b) ^ (c & d) (offtopic: ouch, таблица приоритетов C-стиля отстой).

Вот метод var arg XOR для java …

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

наслаждаться

Вы можете использовать Xtend (операторы Infix и перегрузку оператора), чтобы перегрузить операторы и «остаться» на Java

То, о чем вы просите, не имеет большого смысла. Если я не прав, вы предполагаете, что хотите использовать 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. Это приведет к удалению большей части смыслового значения из операции и представляет собой логический тест, который вы не должны использовать в любом случае.

A и B должны быть логическими значениями, чтобы сделать! = То же, что и xor, чтобы таблица истинности выглядела одинаково. Вы также можете использовать! (A == B) lol.

Я использую очень популярный class “org.apache.commons.lang.BooleanUtils”

Этот метод проверяется многими пользователями и безопасен. Повеселись. Применение:

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

Вызывается логическое исключение – или в Java != . Вы также можете использовать ^ если хотите запутать своих друзей.

Поскольку тип булевых данных хранится как целое число, оператор бит ^ функционирует подобно операции 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); } 

вам нужно переключиться на Scala, чтобы реализовать своих собственных операторов

пример трубы

  • Почему sizeof считается оператором?
  • Разница между ++ Var и Var ++
  • Почему «оператор void» не вызывается с синтаксисом броска?
  • Почему компиляторы C ++ не определяют operator == и operator! =?
  • Оператор VBA «И» оценивает второй аргумент, когда первый является ложным?
  • Оператор тильды в C
  • Оператор копирования и оператор присваивания
  • Оператор PowerShell и -contains
  • Какие хорошие право-ассоциативные методы в Scala?
  • Конструктор преобразования и оператор преобразования: приоритет
  • Сделать оператор << виртуальным?
  • Давайте будем гением компьютера.