观察:

Java有一个逻辑与运算符。 Java有一个逻辑或运算符。 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中定义新操作符的内容。我该从哪里开始呢?


当前回答

因为布尔数据类型像整数一样存储,所以如果使用布尔值,位操作符^的功能就像异或操作一样。

//©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
            */
        }
    }

其他回答

逻辑异或在Java中被称为!=。如果你想迷惑你的朋友,你也可以使用^。

A和B必须是布尔值,才能使!=与xor相同,这样真值表看起来就会相同。你也可以用!(A==B) lol。

以下是你的代码:

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所说,已经有^ operator了。

!=和^对布尔操作数(你的情况)的作用相同,但对整数操作数的作用不同。

* Notes: 1. They work identically for boolean (primitive type), but not Boolean (object type) operands. As Boolean (object type) values can have value null. And != will return false or true when one or both of its operands are null, while ^ will throw NullPointerException in this case. 2. Although they work identically, they have different precedence, e.g. when used with &: a & b != c & d will be treated as a & (b != c) & d, while a & b ^ c & d will be treated as (a & b) ^ (c & d) (offtopic: ouch, C-style precedence table sucks).

这是因为操作符重载是他们故意在语言中遗漏的东西。他们用字符串连接“欺骗”了一点,但除此之外,这样的功能并不存在。

(免责声明:我没有接触过java的前两个主要发行版,所以如果它现在加入,我会非常惊讶)

你需要切换到Scala来实现你自己的操作符

管的例子