观察:

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中定义新操作符的内容。我该从哪里开始呢?


当前回答

也许你误解了&和&&,|和||之间的区别 快捷操作符&&和||的目的是第一个操作数的值可以确定结果,因此不需要计算第二个操作数。

如果第二个操作数将导致错误,这尤其有用。 如。

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

然而,对于XOR,你总是必须计算第二个操作数才能得到结果,所以唯一有意义的操作是^。

其他回答

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

不是x != y吗?

你的要求没多大意义。除非我说错了,否则你是在暗示你想用异或来执行逻辑运算,就像AND和OR一样。你提供的代码实际上显示了我指的是什么:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

您的函数有布尔输入,当对布尔使用按位XOR时,结果与您提供的代码相同。换句话说,在比较单个位(布尔值)或比较较大值中的单个位时,按位XOR已经很有效了。把它放在上下文中,就二进制值而言,任何非零值都是TRUE,只有0是false。

因此,要像应用逻辑与一样应用XOR,您要么只使用带有一个比特的二进制值(给出相同的结果和效率),要么必须将二进制值作为一个整体而不是每个比特来计算。换句话说,表达式(010 ^^ 110)= FALSE而不是(010 ^^ 110)= 100。这将从操作中移除大部分语义含义,并表示您无论如何都不应该使用的逻辑测试。

我使用的是非常流行的类"org。apache。commons。lang。booleanutils "

这种方法经过许多用户的测试,是安全的。玩得开心。 用法:

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

这是一个使用XOR(^)的例子

byte[] array_1 = new byte[] { 1, 0, 1, 0, 1, 1 };
byte[] array_2 = new byte[] { 1, 0, 0, 1, 0, 1 };

byte[] array_3 = new byte[6];

int i = 0;
for (byte b : array_1)
    array_3[i] = b ^ array_2[i++];

输出

0 0 1 1 1 0