创建一个“逻辑排他性或”;Java运算符

观察:

Java有一个逻辑与运算符 Java有一个逻辑或运算符
Java有一个逻辑NOT运算符

问题:

Java没有逻辑XOR运算符,据太阳报报道。我想定义一个

方法定义:

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

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

< BR >

方法调用:

这个方法的调用方式如下:

boolean myVal = logicalXOR(x, y);

< BR >

操作符用法:

我更希望有一个操作符,使用如下:

boolean myVal = x ^^ y;

< BR >

问题:

我找不到任何关于如何在Java中定义新操作符的内容。我该从哪里开始呢?

368769 次浏览

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

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

Java 是否有逻辑异或运算符,它是(在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中唯一的操作符重载是string (JLS 15.18.1字符串连接操作符+)上的+。

社区多年来一直被分成三部分,三分之一不想要它,三分之一想要它,三分之一不在乎。

你可以使用unicode来创建方法名。如果你想用一个符号,你可以用myVal = x.$(y);其中$是符号,x不是原语…但这在某些编辑器中是很危险的,并且是有限制的,因为你不能在原语中这样做。

Java有一个逻辑与运算符 Java有一个逻辑或运算符

错了。

Java

  • 两个逻辑与运算符:普通AND是&和短路and是&&和
  • 两个逻辑或运算符:正常或为|,短路或为||。

XOR仅作为^存在,因为短路计算是不可能的。

也许你误解了&&&|||之间的区别 快捷操作符&&||的目的是第一个操作数的值可以确定结果,因此不需要计算第二个操作数 如果第二个操作数将导致错误,这尤其有用。 例如< / p >
if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

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

你可以使用Xtend(中缀操作符和操作符重载)重载操作符并在Java上“停留”

这是一个var arg XOR方法的java…

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

享受

你可以只写(a!=b)

这将与a ^ b的工作方式相同。

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

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

以下是你的代码:

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 一样,已经有了^操作符。

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

< p > <子> *注:< br > 1. 它们适用于boolean(基本类型),但不适用于Boolean(对象类型)操作数。作为Boolean(对象类型)值可以有值null。当!=的一个或两个操作数为null时,!=将返回falsetrue,而在这种情况下,^将抛出NullPointerException 2. 虽然它们的工作方式相同,但它们的优先级不同,例如,当与&一起使用时:a & b != c & d将被视为a & (b != c) & d,而a & b ^ c & d将被视为(a & b) ^ (c & d)(跑题了:哎唷,c风格的优先级表糟糕极了)

这里有一个例子:

给定2个int值,如果一个为负,一个为正,则返回true。除非参数"negative"为真,否则只有当两个参数都为负时才返回真。

    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);
}

你的要求没多大意义。除非我说错了,否则你是在暗示你想用异或来执行逻辑运算,就像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。这将从操作中移除大部分语义含义,并表示您无论如何都不应该使用的逻辑测试。

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

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

这个方法经过许多用户的测试,是安全的。玩得开心。 用法:< / p >
boolean result =BooleanUtils.xor(new boolean[]{true,false});

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

管道示例

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

这是一个使用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

可以实现使用流API在java 8及以上

public static boolean logicalXOR(boolean x, boolean y) {  // can modify to take [] or list of bools
return Stream.of(x, y)  // modify as per method params
.filter(bool -> bool)
.count() == 1;
}