Exclusive “or” (xor) Logical Operator

In some scripting languages like PHP, there exists a logical operator (e.g. &&||andor, etc.) called the “Exclusive Or”. The exclusive or evaluates two booleans. It then returns true if exactly one of the two expressions are true, false otherwise. For example:

// since both are false
false xor false == false

// exactly one of the two expressions are true
true xor false == true

// exactly one of the two expressions are true
false xor true == true

// Both are true.  "xor" only returns true if EXACTLY one of the two expressions evaluate to true.
true xor true == false

## How to create a Logical Operator in Java#

As Java does not ship out the box with this functionality, we can easily create it ourselves.

To create an xor logical operator, or exclusive or as it is sometimes referred to, we can look to implement the following:

## The solution in Java#

In Java we can use the caret character to perform an XOR operation.

public class XOR {
public static boolean xor(boolean a, boolean b) {
// using the caret character
return a ^ b;
}
}

## Some test cases to validate our method#

import static org.junit.Assert.*;
import org.junit.Test;

public class XORTest {

private static void testing(boolean actual, boolean expected) {
assertEquals(expected, actual);
}

@Test
public void testBasic() {
System.out.println("Testing basics.");
testing(XOR.xor(false, false), false);
testing(XOR.xor(true, false), true);
testing(XOR.xor(false, true), true);
testing(XOR.xor(true, true), false);
}
@Test
public void testNested() {
System.out.println("Testing nested calls.");
testing(XOR.xor(false, XOR.xor(false, false)), false);
testing(XOR.xor(XOR.xor(true, false), false), true);
testing(XOR.xor(XOR.xor(true, true), false), false);
testing(XOR.xor(true, XOR.xor(true, true)), true);
testing(XOR.xor(XOR.xor(false, false), XOR.xor(false, false)), false);
testing(XOR.xor(XOR.xor(false, false), XOR.xor(false, true)), true);
testing(XOR.xor(XOR.xor(true, false), XOR.xor(false, false)), true);
testing(XOR.xor(XOR.xor(true, false), XOR.xor(true, false)), false);
testing(XOR.xor(XOR.xor(true, true), XOR.xor(true, false)), true);
testing(XOR.xor(XOR.xor(true, XOR.xor(true, true)), XOR.xor(XOR.xor(true, true), false)), true);
}
}