在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道的例子