1. Introduction
In Java, we've got two ways to say “AND”. But which to use?
In this tutorial, we'll look at the differences between & and &&. And, we'll learn about bitwise operations and short-circuiting along the way.
2. Use of Bitwise AND
The bitwise AND (&) operator compares each binary digit of two integers and returns 1 if both are 1, otherwise, it returns 0.
Let's take a look at two integers:
int six = 6; int five = 5;
Next, let's apply a bitwise AND operator on these numbers:
int resultShouldBeFour = six & five; assertEquals(4, resultShouldBeFour);
To understand this operation, let's look at the binary representation of each number:
Binary of decimal 4: 0100 Binary of decimal 5: 0101 Binary of decimal 6: 0110
The & operator performs a logical AND on each bit, and returns a new binary number:
0110 0101 ----- 0100
Finally, our result – 0100 – can be converted back to decimal number – 4.
Let's see the test Java code:
int six = 6; int five = 5; int resultShouldBeFour = six & five; assertEquals(4, resultShouldBeFour);
2.1. Use of & with Booleans
Also, we can use the bitwise AND (&) operator with boolean operands. It returns true only if both the operands are true, otherwise, it returns false.
Let's take three boolean variables:
boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false;
Next, let's apply a bitwise AND operator on variables trueBool and anotherTrueBool:
boolean trueANDtrue = trueBool & anotherTrueBool;
Then, the result will be true.
Next, let's apply a bitwise AND operator on trueBool and falseBool:
boolean trueANDFalse = trueBool & falseBool;
In this case, the result will be false.
Let's see the test Java code:
boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false; boolean trueANDtrue= trueBool & anotherTrueBool; boolean trueANDFalse = trueBool & falseBool; assertTrue(trueANDtrue); assertFalse(trueANDFalse);
3. Use of Logical AND
Like &, the logical AND (&&) operator compares the value of two boolean variables or expressions. And, it returns also true only if both operands are true, otherwise, it returns false.
Let's take three boolean variables:
boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false;
Next, let's apply a logical AND operator on variables trueBool and anotherTrueBool:
boolean trueANDtrue = trueBool && anotherTrueBool;
Then, the result will be true.
Next, let's apply a logical AND operator on trueBool and falseBool:
boolean trueANDFalse = trueBool && falseBool;
In this case, the result will be false.
Let's see the test Java code:
boolean trueBool = true; boolean anotherTrueBool = true; boolean falseBool = false; boolean anotherFalseBool = false; boolean trueANDtrue = trueBool && anotherTrueBool; boolean trueANDFalse = trueBool && falseBool; boolean falseANDFalse = falseBool && anotherFalseBool; assertTrue(trueANDtrue); assertFalse(trueANDFalse); assertFalse(falseANDFalse);
3.1. Short-circuit
So, what's the difference? Well, the && operator short-circuits. This means it doesn't evaluate the right-hand side operand or expression when the left-hand side operand or expression is false.
Let's take two expressions evaluating as false:
First Expression: 2<1 Second Expression: 4<5
When we apply a logical AND operator on expressions 2<1 and 4<5, then it evaluates only the first expression 2<1 and returns false.
boolean shortCircuitResult = (2<1) && (4<5); assertFalse(shortCircuitResult);
3.2. Use of && with Integers
We can use the & operator with boolean or numeric types but && can only be used with boolean operands. Using it with integer operands results in a compilation error:
int five = 2; int six = 4; int result = five && six;
4. Comparison
- The & operator always evaluates both expressions, whereas the && operator evaluates the second expression only if the first one is true
- & compares each operand bitwise, whereas && operates only on booleans
5. Conclusion
In this article, we used the bitwise & operator to compare bits of two digits resulting in a new digit. Also, we used the logical && operator to compare two booleans, resulting in a boolean value.
We also saw some key differences between the two operators.
As always you can find the code for this tutorial over on GitHub.