观察:
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中定义新操作符的内容。我该从哪里开始呢?
以下是你的代码:
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).
你的要求没多大意义。除非我说错了,否则你是在暗示你想用异或来执行逻辑运算,就像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。这将从操作中移除大部分语义含义,并表示您无论如何都不应该使用的逻辑测试。
这是一个使用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