Создание логического эксклюзивного или оператора в 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 сказал, уже существует оператор ^.

!= и ^ работают тождественно для булевых операндов (ваш случай), но по-разному для целых операндов.

Ответ 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, чтобы реализовать свои собственные операторы

пример трубы