Java Bitwise Operators Tutorial with Code Examples

Java bitwise operators allow you to manipulate individual bits of integer types (such as int, short, byte, and long).

These operators are less commonly used than arithmetic and relational operators, but they are crucial in low-level programming, such as system programming, cryptography, network programming, and bit manipulation tasks.

In this tutorial, we will walk through Java's bitwise operators, provide code examples, and explain how these operators work with binary values.

Table of Contents:

1. Introduction to Bitwise Operators

Bitwise operators perform operations on binary representations of integers. These operators treat operands as sequences of bits (binary digits) rather than as decimal, hexadecimal, or octal numbers. Bitwise operations are often used when you need to manipulate specific bits within a number or when working with binary protocols.

2. List of Java Bitwise Operators

Java provides several bitwise operators:

Operator Name Description
& Bitwise AND Performs AND operation on each bit
` ` Bitwise OR
^ Bitwise XOR Performs XOR operation on each bit
~ Bitwise NOT Inverts the bits (complement operation)
<< Left Shift Shifts bits to the left, filling with zeros
>> Right Shift Shifts bits to the right, preserving the sign bit
>>> Unsigned Right Shift Shifts bits to the right, filling with zeros

 

3. Bitwise AND (&) with Examples

The bitwise AND (&) operator compares corresponding bits of two numbers and returns 1 if both bits are 1; otherwise, it returns 0.

Example 1: Bitwise AND

public class Main {
    public static void main(String[] args) {
        int a = 6;  // Binary: 110
        int b = 3;  // Binary: 011

        int result = a & b;  // Binary: 010 (decimal 2)
        System.out.println("Bitwise AND: " + result);  // Output: 2
    }
}

Explanation:

6 in binary is 110, and 3 in binary is 011.
The bitwise AND operation results in 010, which is 2 in decimal.

4. Bitwise OR (|) with Examples

The bitwise OR (|) operator compares corresponding bits of two numbers and returns 1 if at least one of the bits is 1; otherwise, it returns 0.

Example 2: Bitwise OR

public class Main {
    public static void main(String[] args) {
        int a = 6;  // Binary: 110
        int b = 3;  // Binary: 011

        int result = a | b;  // Binary: 111 (decimal 7)
        System.out.println("Bitwise OR: " + result);  // Output: 7
    }
}

Explanation:

The OR operation between 110 (6) and 011 (3) results in 111, which is 7 in decimal.

5. Bitwise XOR (^) with Examples

The bitwise XOR (^) operator returns 1 if the corresponding bits of two numbers are different; otherwise, it returns 0.

Example 3: Bitwise XOR

public class Main {
    public static void main(String[] args) {
        int a = 6;  // Binary: 110
        int b = 3;  // Binary: 011

        int result = a ^ b;  // Binary: 101 (decimal 5)
        System.out.println("Bitwise XOR: " + result);  // Output: 5
    }
}

Explanation:

XOR between 110 (6) and 011 (3) results in 101, which is 5 in decimal.

6. Bitwise NOT (~) with Examples

The bitwise NOT (~) operator inverts all the bits of the number, turning 1s into 0s and vice versa. This operation is also called the bitwise complement.

Example 4: Bitwise NOT

public class Main {
    public static void main(String[] args) {
        int a = 5;  // Binary: 00000000 00000000 00000000 00000101

        int result = ~a;  // Inverted: 11111111 11111111 11111111 11111010 (decimal -6)
        System.out.println("Bitwise NOT: " + result);  // Output: -6
    }
}

Explanation:

The bitwise NOT of 5 flips every bit. In 32-bit two’s complement representation, ~5 is -6.

7. Bitwise Shift Operators

Left Shift (<<)

The left shift (<<) operator shifts all bits of the number to the left by a specified number of positions, filling the right side with zeros. This is equivalent to multiplying the number by 2^n, where n is the number of positions shifted.

Example 5: Left Shift

public class Main {
    public static void main(String[] args) {
        int a = 3;  // Binary: 11

        int result = a << 2;  // Shifts left by 2: 1100 (decimal 12)
        System.out.println("Left Shift: " + result);  // Output: 12
    }
}

Explanation:

Shifting 3 left by 2 positions gives 12 (1100 in binary).

Right Shift (>>)

The right shift (>>) operator shifts all bits of the number to the right by a specified number of positions, preserving the sign bit (leftmost bit). This is equivalent to dividing the number by 2^n.

Example 6: Right Shift

public class Main {
    public static void main(String[] args) {
        int a = 12;  // Binary: 1100

        int result = a >> 2;  // Shifts right by 2: 11 (decimal 3)
        System.out.println("Right Shift: " + result);  // Output: 3
    }
}

Explanation:

Shifting 12 right by 2 positions gives 3 (11 in binary).

Unsigned Right Shift (>>>)

The unsigned right shift (>>>) operator shifts all bits to the right and fills the leftmost bits with zeros, regardless of the sign bit. This operator works similarly to the right shift, but it does not preserve the sign.

Example 7: Unsigned Right Shift

public class Main {
    public static void main(String[] args) {
        int a = -12;  // Binary: 11111111 11111111 11111111 11110100 (two's complement)

        int result = a >>> 2;  // Shift right by 2, filling with zeros
        System.out.println("Unsigned Right Shift: " + result);  // Output: 1073741821
    }
}

Explanation:

The unsigned right shift shifts -12 to the right by 2 positions and fills the leftmost bits with 0s, resulting in a large positive number.

8. Working with Bit Masks

A bit mask is a value used to select specific bits from another value using bitwise operators. Bit masks are useful when you need to manipulate specific bits.

Example 8: Using Bit Mask to Set Specific Bits

public class Main {
    public static void main(String[] args) {
        int value = 42;  // Binary: 101010
        int mask = 1 << 3;  // Bit mask to set the 3rd bit: 1000

        int result = value | mask;  // Set the 3rd bit: 101010 | 1000 = 101010 (remains 42)
        System.out.println("Result with Bit Mask: " + result);
    }
}

Explanation:

The bit mask 1 << 3 shifts a 1 to the 3rd position, and the OR operation sets the 3rd bit of the original value.

9. Bitwise Operators on Different Data Types

Bitwise operators in Java work on int, byte, short, char, and long. If you are working with smaller types like byte or short, the values are automatically promoted to int before the bitwise operation, and the result is an int.

Example 9: Bitwise Operation on byte

public class Main {
    public static void main(String[] args) {
        byte a = 9;  // Binary: 1001
        byte b = 12; // Binary: 1100

        int result = a & b;  // Binary: 1000 (decimal 8)
        System.out.println("Bitwise AND on byte: " + result);  // Output: 8
    }
}

10. Common Use Cases for Bitwise Operators

Example 10: Checking if a Number is Even or Odd Using Bitwise AND

public class Main {
    public static void main(String[] args) {
        int number = 13;

        if ((number & 1) == 0) {
            System.out.println(number + " is even.");
        } else {
            System.out.println(number + " is odd.");
        }
    }
}

Explanation:

The least significant bit (LSB) of an odd number is always 1, so number & 1 checks if the LSB is 1 (odd) or 0 (even).

Example 11: Swapping Two Numbers Using XOR

public class Main {
    public static void main(String[] args) {
        int a = 5, b = 9;

        a = a ^ b;  // Step 1
        b = a ^ b;  // Step 2
        a = a ^ b;  // Step 3

        System.out.println("Swapped values: a = " + a + ", b = " + b);  // Output: a = 9, b = 5
    }
}

Explanation:

XOR swapping is a technique that swaps two values without using a temporary variable.

Conclusion

Java's bitwise operators allow you to manipulate individual bits within integer types, which is useful in various low-level programming tasks, such as bit manipulation, data encoding, and working with hardware or protocols.

By understanding operators like AND (&), OR (|), XOR (^), NOT (~), and bit shifts, you can efficiently perform bit-level operations.

Through the examples in this tutorial, you should now have a better understanding of how to use bitwise operators in Java.

Related posts

Java Data Types Tutorial

Java Boolean Class Tutorial

Java Number Class Tutorial