在Java中创build“逻辑独占”或“运算符”

观察:

Java有一个逻辑AND运算符。
Java有一个逻辑OR运算符。
Java有一个逻辑NOT运算符。

问题:

根据sun的说法, Java没有逻辑异或运算符。 我想定义一个。

方法定义:

作为一种方法,它被简单地定义如下:

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

方法调用:

以下面的方法调用这个方法:

 boolean myVal = logicalXOR(x, y); 

运算符用法:

我宁愿有一个运营商,使用如下:

 boolean myVal = x ^^ y; 

题:

我无法find关于如何在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有一个逻辑AND运算符。
Java有一个逻辑OR运算符。

错误。

Java有

  • 两个逻辑AND运算符:正常AND是&和短路AND是&&,和
  • 两个逻辑OR运算符:正常OR是| 并且短路OR是||。

异或只存在^,因为短路评估是不可能的。

也许你误解了&和&&,|之间的区别 和|| 捷径运算符的用途&&和|| 是第一个操作数的值可以决定结果,所以第二个操作数不需要被评估。

如果第二个操作数会导致错误,这是特别有用的。 例如

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

但是,使用XOR时,您总是必须评估第二个操作数才能得到结果,因此唯一有意义的操作是^

你可以写(a!= b)

这将像a ^ b一样工作

这是因为操作符重载是他们故意排除在语言之外的东西。 他们用string连接“欺骗”了一下,但除此之外,这样的function并不存在。

(免责声明:我没有与最近的两个主要版本的java,所以如果它现在在我会非常惊讶)

Java中唯一的重载操作符是Strings( JLS 15.18.1 String Concatenation Operator + )上的+号 。

社区已经分了三年,三分之一不要,三分之一,三分之一不在意。

你可以使用unicode来创build符号的方法名…所以如果你有一个符号你想使用你可以做myVal = x。$(y); 其中$是符号,而x不是原始的……但是在某些编辑器中,这将会是一个狡猾的行为,并且因为你不能在一个原语中做到这一点而受到限制。

这是一个var arg异或方法java …

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

请享用

以下你的代码:

 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 所说 ,已经有^运营商。

!=^对于布尔操作数(您的情况)的工作方式是相同的,但对于整数操作数是不同的。

你可以使用Xtend(Infix操作符和操作符重载)来重载操作符并保留在Java上

你要的东西没有什么意义。 除非我不正确,否则build议您使用XOR以相同方式执行逻辑运算。 你提供的代码实际上显示了我所想要的:

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

你的函数有布尔input,当在布尔值上使用按位异或时,结果与你提供的代码相同。 换句话说,在比较各个比特(布尔值)或比较较大值中的各个比特时,逐位异或已经是有效的。 为了把它放到上下文中,就二进制值而言,任何非零值都是TRUE,只有ZERO是假的。

因此,对于异或应用相同的方式逻辑与应用,或者只使用二进制值只有一个位(给出相同的结果和效率)或二进制值将不得不被评估为一个整体而不是每位。 换句话说,expression式(010 ^^ 110)= FALSE而不是(010 ^^ 110)= 100.这将从操作中删除大部分的语义含义,并代表一个您不应该使用的逻辑testing。

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

我使用非常stream行的类“org.apache.commons.lang.BooleanUtils”

这个方法经过了许多用户的testing和安全。 玩的开心。 用法:

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

因为布尔数据types被存储为整数,所以如果与布尔值一起使用,则比特运算符^像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。

  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来实现您自己的操作员

pipe道的例子