Published: 22 Nov 2025 | Reading Time: 5 min read
This comprehensive guide covers:
If you have ever wondered, "How does Java actually see my numbers?", this is the blog that finally answers it.
Most Java developers rely heavily on arithmetic and logical operators, but only a few truly explore the hidden power buried one layer deeper: bitwise operations.
If you have ever wondered how encryption works, why graphics render fast, or how systems manage memory efficiently, the answer lies in the bitwise operator in Java. They're the invisible gears of performance-critical software.
In this blog, you will learn how the bitwise operator in Java works—from AND, OR, XOR to shifting, masking, and solving real-world bit manipulation problems, all explained simply.
"If you can control the bits, you can control everything."
Bitwise operators in Java let you work directly with the individual bits that make up a number. Since computers store everything as 1s and 0s, these operators give you precise control over that binary data, allowing you to flip bits, compare them, or shift them in any direction.
They play a major role in areas where performance and memory efficiency matter the most: operating systems, networking, embedded systems, encryption, servers, and even database engines. Whenever you need low-level control or want your code to run as fast and efficiently as possible, bitwise operators become essential.
The bitwise operator in Java is frequently used when working with data at a low level and in detail. It allows you to work with individual bits of a number, which is very helpful for things like memory conservation, performance optimization, and direct hardware interaction.
What is the purpose of the bitwise operators in Java, then? Speed is a major factor. It may be quicker to shift or AND bits than to conduct standard arithmetic or logical operations. Bitwise operators give you an efficient approach to handle information in real-time or when working with large amounts of data. Additionally, they are effective for situations when memory consumption is essential. You can store more data in less space by utilizing bits rather than full numbers.
In Java, each number is stored as a series of bits (0s and 1s). This Java bitwise operators tutorial, which is the subject of this, enables you to perform the operations directly on these bits. For instance, the AND operator (&) is used to compare each of the bits in two numbers and give back 1 only if both are 1. The OR (|) operator returns a 1 if one of the bits is 1. Shifting acts as a mode of operation where the bits are moved left or right, equivalent to multiplying or dividing the number by powers of two.
In short, bitwise operator in Java allow you to manipulate the low-level nature of the data, which helps you improve the speed, efficiency, and flexibility of your code.
Let's learn about the different types of bitwise operators in Java, explore how they work, and look at some examples.
The bitwise AND operator in Java compares the corresponding bits of two integers for each of them and generates a 1 only if both bits are 1. Please note that if either or both bits are 0, the result will be 0.
Let's take:
Now, line them up and apply AND:
1100 (12)
& 0101 (5)
--------
0100 (result)
What does 0100 mean?
That's 4 in decimal.
So, 12 & 5 = 4
Easy Way to Remember:
public class BitwiseANDExample {
public static void main(String[] args) {
int a = 12; // 1100 in binary
int b = 5; // 0101 in binary
int result = a & b; // Perform AND operation
System.out.println("a & b = " + result); // Output the result
}
}
a & b = 4
When the bitwise OR operator is used to compare two numbers, the outcome is 1 if at least one of the associated bits is 1. The outcome is 0 if both bits are 0.
Bitwise OR (|) operation using:
a = 12 → Binary: 1100
b = 5 → Binary: 0101
Now apply the bitwise OR:
1100 (12 in binary)
|0101 (5 in binary)
--------
1101 (Result is 13 in decimal)
Bit-by-bit comparison:
1 | 0 = 1
1 | 1 = 1
0 | 0 = 0
0 | 1 = 1
So, the binary result is 1101, which equals 13 in decimal.
Therefore, 12 | 5 = 13.
public class BitwiseORExample {
public static void main(String[] args) {
int a = 12; // 1100 in binary
int b = 5; // 0101 in binary
int result = a | b; // Perform OR operation
System.out.println("a | b = " + result); // Output the result
}
}
a | b = 13
When two integers' corresponding bits are compared using the bitwise Java XOR operator (exclusive OR), if the bits differ, the result is 1. The outcome is 0 if the bits are identical.
Let's take:
Now let's apply the bitwise XOR ( ^ ) operator:
1100 (12 in binary)
^0101 (5 in binary)
--------
1001 (Result in binary = 9 in decimal)
Final result:
12 ^ 5 = 9
Explanation:
1 ^ 0 = 1
1 ^ 1 = 0
0 ^ 0 = 0
0 ^ 1 = 1
Only the bits that are different become 1, and others become 0.
public class BitwiseXORExample {
public static void main(String[] args) {
int a = 12; // 1100 in binary
int b = 5; // 0101 in binary
int result = a ^ b; // Perform XOR operation
System.out.println("a ^ b = " + result); // Output the result
}
}
a ^ b = 9
Every bit in the operand is inverted by the bitwise NOT operator. To put it simply, it converts all 1s to 0s and all 0s to 1. Another name for this is the bitwise complement.
Let's take a = 12 and apply the bitwise NOT (~) operator step by step.
00001100 → this is 12 in binary
11110011
To find out which negative number it is, do the two's complement:
a. Invert the bits again:
00001100
b. Add 1:
00001100 + 1 = 00001101 → 13
So, 11110011 is -13 in decimal.
~12 = -13
public class BitwiseNOTExample {
public static void main(String[] args) {
int a = 12; // 1100 in binary
int result = ~a; // Perform NOT operation
System.out.println("~a = " + result); // Output the result
}
}
~a = -13
The left shift operator shifts an integer's bits left by a certain number of places. Each shift to the left by one position is the same as multiplying the number by 2. This is how the left-shift operator operates to fill the rightmost bits with zeros.
Here's the simple calculation for left shifting a = 5 by 1 position:
Given:
a = 5
Binary of 5 = 0000 0101
Left Shift Operation:
a << 1 means shift all bits to the left by 1 position:
0000 0101 << 1 = 0000 1010
Result:
0000 1010 = 10 (in decimal)
So,
5 << 1 = 10
Explanation:
Each left shift multiplies the number by 2.
So, 5 << 1 = 5 * 2 = 10, and that's exactly what we got.
public class LeftShiftExample {
public static void main(String[] args) {
int a = 5; // 0101 in binary
int result = a << 2; // Shift left by 2 positions
System.out.println("a << 2 = " + result); // Output the result
}
}
a << 2 = 20
The right shift operator shifts the bits of a number to the right by a number of positions that is specified. Each shift to the right by one position is equivalent to dividing by 2. The leftmost bits (the sign bit) are filled with the original sign bit for signed numbers.
Let's break it down simply using a = 20 and the right shift operator >>.
Binary of 20 = 0001 0100
Operation: a >> 1
Before shift: 0001 0100 (20)
After shift: 0000 1010 (10)
So,
int a = 20;
int result = a >> 1; // result = 10
Explanation:
Each right shift divides the number by 2.
That's how right shift works, simple and efficient.
public class RightShiftExample {
public static void main(String[] args) {
int a = 20; // 10100 in binary
int result = a >> 2; // Shift right by 2 positions
System.out.println("a >> 2 = " + result); // Output the result
}
}
a >> 2 = 5
The program will print 5, as the right shift operation divides the number by 4.
Regardless of sign, the unsigned right shift operator shifts the bits to the right and adds zeros to the leftmost bits. This method can be used when unsigned data types are in use.
Let's break it down simply using a = -20 and the unsigned right shift operator (>>>) in Java.
Value:
int a = -20;
int result = a >>> 2;
System.out.println(result);
Explanation:
-20 = 11111111 11111111 11111111 11101100
00111111 11111111 11111111 11111011
= 1073741819
public class UnsignedRightShiftExample {
public static void main(String[] args) {
int a = -20; // 11111111111111111111111111101100 in binary (two's complement)
int result = a >>> 2; // Unsigned right shift by 2 positions
System.out.println("a >>> 2 = " + result); // Output the result
}
}
a >>> 2 = 1073741815
| Operator | Symbol | What It Does | Simple Meaning | Example Result |
|---|---|---|---|---|
| Bitwise AND | & | Compares each bit and returns 1 only if both bits are 1 | "Both must be true" | 12 & 5 = 4 |
| Bitwise OR | | | Returns to 1 if at least one of the bits is 1 | "Either is enough" | 12 | 5 = 13 |
| Bitwise XOR | ^ | Returns 1 when bits are different | "True if different" | 12 ^ 5 = 9 |
| Bitwise NOT | ~ | Flips every bit (0→1, 1→0) | "Invert everything" | ~12 = -13 |
| Left Shift | << | Shifts bits left, filling right with 0 | Multiply by 2ⁿ | 5 << 1 = 10 |
| Right Shift (Signed) | >> | Shifts bits right, preserving sign | Divide by 2ⁿ | 20 >> 1 = 10 |
| Unsigned Right Shift | >>> | Shifts bits right, filling left with 0 | Always a positive shift | -20 >>> 2 = 1073741815 |
Bitwise operations are best understood by visualizing how they work at the binary level. Truth tables and binary representations help clarify exactly how each bitwise operator affects the bits of its operands. This section covers how to represent numbers in binary, how the core bitwise operators work bit by bit, and how truth tables can be used as a reference for their behavior.
In Java, integers are stored as sequences of bits (0s and 1s). For example:
When you apply bitwise operations, you are manipulating these binary digits directly.
Below is the simplest truth table showing how AND (&), OR (|), and XOR (^) behave for every combination of two bits:
| a | b | a & b | a | b | a ^ b |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Unary operator → flips each bit
Let's see how these operators work with actual numbers:
a = 12 → 1100
b = 5 → 0101
12 & 5:
1100
0101
----
0100 → 4
12 | 5:
1100
0101
----
1101 → 13
12 ^ 5:
1100
0101
----
1001 → 9
a = 5 → 0000 0101 (8 bits)
~a:
1111 1010 → -6 (two's complement)
Bitwise operators are used extensively in programming and applications, particularly where hardware interface, memory, or execution efficiency are crucial. They are not only an academic subject. Here are a few instances of the most typical and valuable applications for bitwise operators:
You can effectively bundle all of your boolean flags into a single integer value by using bitwise operators for flag management. This is helpful when storing features, toggles, hardware register settings, and permissions.
number = number | (1 << n); // Sets the nth bit to 1
number = number & ~(1 << n); // Clears the nth bit (sets to 0)
number = number ^ (1 << n); // Flips the nth bit
Example: Managing user permissions (read, write, execute) using bits in a single integer.
Bit masking is used to obtain, set, or clear a value of individual bits. Bit masking is ubiquitous in protocols, graphics, and embedded systems.
int lowerNibble = number & 0x0F;
boolean isSet = (number & (1 << n)) != 0;
Bit shifts are a fast way to multiply or divide integers by powers of two.
result = number << 1;
result = number >> 3;
In terms of speed, this will typically be more efficient than using multiplication or division, and it could even be more effective than other translation techniques, especially in code that is performance-critical.
Bitwise operators allow for packing multiple booleans, or small integers, into a single variable from a memory perspective. This is beneficial in embedded systems and applications that must comply with strict memory limitations.
Example: Store up to 32 boolean flags in single variable, using an integer data type.
Bitwise XOR (^) and other bitwise operations form the basis of many encryption algorithms and hash algorithms. Bitwise manipulation is synonymous with the obfuscation of the assembly of information on a binary basis.
Bitwise operations are used to compress data, encode information efficiently, and implement custom binary protocols. They enable you to neatly pack data by manipulating individual bits.
Checksums, parity computations, and error correction codes (such as Hamming codes) use bitwise operations to identify and fix problems during transmission or storage.
Subnet masks, protocol flags, and IP addresses may all be changed using bitwise operators. For instance, bit masking and shifting are required when dividing an IP address into its network and host components.
Setting, clearing, or toggling bits in particular hardware register bits is sometimes required when working directly with hardware. Bitwise operators provide the incredibly precise control needed for device driver development or low-level programming.
Bitwise operators are essential tools for:
When you understand the role of bitwise operators, you can write more efficient, powerful, and scalable Java programs, especially those that require systems programming, networking, and runtime efficiency.
Here's a comparison between Bitwise Operators and Logical Operators in Java:
| Aspect | Bitwise Operators | Logical Operators |
|---|---|---|
| Operation Level | Works at the bit level of integer values (like int, long, byte). | Works on boolean expressions (true/false values). |
| Common Operators | & (AND), | (OR), ^ (XOR), ~ (NOT), << (Left Shift), >> (Right Shift) | && (AND), || (OR), ! (NOT) |
| Use Case | Used for manipulating individual bits in binary numbers, such as setting flags or performing bit manipulation tasks. | Used for combining or negating boolean conditions, often in control flow and decision-making. |
| Data Types | Works with int, long, byte, and short types. | Works with boolean values (true/false). |
| Result | Produces a result based on binary operations, usually an integer value. | Returns a boolean value (true or false). |
| Evaluation | Operates on each bit of the operand individually. | Operates on the entire boolean expression. |
| Performance | Faster for tasks that need direct bit manipulation (e.g., encryption). | More suitable for logical conditions in programs. |
| Example | a & b, a | b, a ^ b, a << 1 | a && b, a || b, !a |
Bitwise Operator:
int a = 5; // 0101 in binary
int b = 3; // 0011 in binary
System.out.println(a & b); // Output: 1 (0001 in binary)
Logical Operator:
boolean a = true;
boolean b = false;
System.out.println(a && b); // Output: false
Bitwise operators in Java offer several advantages, especially when working with low-level programming, performance-critical code, or system-level applications. Here are the key advantages of using bitwise operators in Java:
Bitwise operators work on binary data, so they will execute faster than other types of operations. They provide a real benefit in performance-critical scenarios like games and encryption.
Bitwise operations will also benefit memory usage, since they allow you to operate on smaller pieces of data, such as modifying a single bit of data, instead of larger variables.
Using bitwise operators provides direct control over each individual bit of the data you are working with. This could be useful when you need to set, clear, or query whether an individual bit is on or off, such as flagging on or off, or masking with bits.
Bitwise operators are essential in low-level programming, like interacting with hardware or creating custom protocols, where performance and precision matter most.
For certain operations, like multiplying or dividing by powers of two, bitwise shifts can do the job much faster than regular multiplication or division.
Below are several of the major disadvantages of bitwise operations in Java:
Bitwise operations can be confusing for beginners, which is even more true if you're not comfortable with binary numbers and low-level programming.
Since bitwise operations often involve complex expressions with binary data, they can be harder to debug, making it challenging to track down issues.
Bitwise operations are unnecessary in many cases and can unduly complicate basic software when used in minor applications.
Bitwise operations are prone to mistakes since it is simple to use the incorrect mask or shift bits the incorrect amount of times, which can result in complexity or unexpected consequences.
Code using bitwise operators can be more challenging to read and understand, especially for others who are unfamiliar with this kind of operation.
Bit manipulation is a powerful set of techniques that uses low-level binary operations to solve problems more efficiently. These tricks often yield faster, more memory-efficient solutions than relying purely on arithmetic or loops.
Here are a few standard problems where bit manipulations shine:
| Problem | Description | What to Use |
|---|---|---|
| Check if a number is a power of two | Determine if n is exactly one bit set | (n & (n - 1)) == 0 && n > 0 |
| Count set bits (Hamming weight) | Given an integer, count how many 1s in its binary form | while(n) { n &= (n - 1); count++; } |
| Bitwise masking | Set/clear/toggle specific bits in an integer | Use &, |, ^ with bit masks |
| Swap odd and even bits | Given a number, swap its even-positioned bits with odd-positioned bits | Use masks & shifts |
| Left/right shifts for multiply/divide by 2ⁿ | Multiply/divide by powers of two without arithmetic | Use << or >> |
| Bitwise and on flags/compact storage | Store multiple true/false flags in one integer | Use different bit positions for each flag |
| Count the different bits between two numbers | How many bit positions differ between a and b | Use xor = a ^ b; then count set bits in xor |
Remember: By mastering these tricks and typical problems, you're not just solving puzzles, you're building low-level intuition that can make your code faster, leaner, and more elegant. Use these techniques in your next algorithm challenge or system-design interview and watch the difference.
It makes understanding bitwise operators much easier when you get to see them in action. To that end, this section provides practical examples from Java code, so you can better understand each major bitwise operator with its outputs and explanations. In addition to seeing this code example, the demonstrations will help solidify your understanding of how each operator manipulates binary data and how it returns to decimal.
Write a program to count the number of 1s in the binary form of a number.
public class HammingWeight {
public static void main(String[] args) {
int num = 29; // 11101
int count = 0;
while (num != 0) {
num &= (num - 1); // clear the lowest set bit
count++;
}
System.out.println("Set Bits = " + count);
}
}
This code counts how many 1s are present in the binary form of a number (called the Hamming Weight). The number 29 is 11101 in binary, which has four 1s. Instead of checking every bit, the code uses a smart trick: num &= (num - 1) removes the lowest set bit in each loop. Each time a 1-bit is removed, the counter increases. This continues until all 1s are gone and num becomes 0. Since 29 has four 1s, the loop runs four times, and the program prints "Set Bits = 4".
Set Bits = 4
Determine if a number is a power of two using bit operations.
public class PowerOfTwoCheck {
public static void main(String[] args) {
int n = 32;
// Check if n is a power of two
boolean isPower = (n & (n - 1)) == 0 && n > 0;
System.out.println(isPower);
}
}
This code checks whether a number is a power of two using a classic bitwise trick. A number like 1, 2, 4, 8, 16, 32… has only one set bit in its binary form. The expression (n & (n - 1)) removes the lowest set bit. For powers of two, this results in 0, because there's only one 1-bit to remove. The code also checks that n > 0 because negative numbers and zero cannot be powers of two. For n = 32, which is 100000 in binary, the condition becomes true, so the program prints true.
true
Swap every odd-positioned bit with its neighbouring even bit.
public class SwapOddEvenBits {
public static void main(String[] args) {
int n = 23; // binary: 10111
int evenMask = 0xAAAAAAAA; // mask even bits
int oddMask = 0x55555555; // mask odd bits
int evenBits = (n & evenMask) >>> 1;
int oddBits = (n & oddMask) << 1;
int result = evenBits | oddBits;
System.out.println(result);
}
}
This program swaps the odd and even bits of number 23. In binary, 23 is 10111. The program uses a couple of masks (evenMask denotes 0xAAAAAAAA) to "isolate" the even-position bits, and oddMask (0x55555555) to isolate the odd-position bits. Then, the program shifts the even bits right and the odd bits left to swap their positions. Finally, it combines them together using OR (|). After swapping the bits of the number 23, the value of the resulting integer after the swap will be printed.
43
Show how Java converts a bitwise NOT result into a negative number using 2's complement.
public class TwosComplementDemo {
public static void main(String[] args) {
int num = 10; // 00001010
int result = ~num; // flips bits
System.out.println(result);
}
}
The program shows how the bitwise NOT operator (~) works, specifically with two's complement. The number 10 is written in binary as 00001010. When using ~num, all of the bits are flipped from binary zero to binary one, resulting in 11110101. In Java, and other programming languages, numbers use two's complement for storage, and thus, a binary number with a starting one has a negative decimal representation. So, 11110101 = -11 in decimal form. This is why the program prints -11, as it is simply the negative representation of the two's complement of the bits.
-11
Note: These examples go beyond theory and show how bitwise operators actually solve real interview-ready problems. They educate Java developers patterns that are common for both coding rounds and viva examinations, such as how to clear bits, recognize powers of two, comprehend 2's complement, and perform efficient operations. These are the most useful examples that will help you build a strong bit-manipulation intuition.
Bitwise operators in Java may not be used daily, but they're essential whenever speed, memory efficiency, and low-level control matter. Knowing how to work at the bit level makes you a stronger Java developer, especially in optimization-heavy areas like competitive programming, game development, security, and embedded systems.
Bitwise operators are the ones that perform operations with the individual bits of binary numbers.
Example: 6 & 3 (Binary: 0110 & 0011 = 0010 → Output: 2).
Utilize bitwise operators in hardware-level programming, cryptography, graphics processing, low-level programming, and optimization.
The hardware does not make any other calculations; it processes the binary data directly, which is why faster results are guaranteed.
XOR (^) returns 1 if two bits are different and 0 if they are the same.
Example: 6 ^ 3 (Binary: 0110 ^ 0011 = 0101 → Output: 5).
The bitwise NOT (~) inverts each bit of a number, turning 0s into 1s and vice versa.
Example: ~6 (Binary: 0110 → 1001, which is -7 in two's complement).
Bitwise operators operate at the binary level, whereas boolean operators (&&, ||, !) operate on true/false values.
Prime Number Program in Java: Explained with Examples - Learn how to write a prime number program in Java with clear logic, optimized algorithms, examples, and interview-ready explanations. (04 Jan 2026, 8 min read)
Why Encapsulation in Java Matters: Learn with Code Snippets - Understand encapsulation in Java, a key object-oriented principle used to restrict direct access and protect internal data from unauthorized changes. (04 Jan 2026, 5 min read)
Master Binary Search in Java: Fast and Efficient Searching Explained - Learn Binary Search in Java with clear logic, easy code examples, and real-world applications. Boost your coding skills with this step-by-step guide! (03 Jan 2026, 5 min read)
Learn Bubble Sort in Java: Easy Sorting Technique Explained - Get a complete guide on bubble sort in Java, including coding examples and tips to understand this basic but important sorting algorithm. (02 Jan 2026, 6 min read)
Best Java Training Institutes in Hyderabad: Your Guide to Career Success - Find the best Java training institutes in Hyderabad for hands-on learning, placement support, and industry-recognized certifications. (02 Jan 2026, 5 min read)
Understanding Inheritance in Java: Key Concepts & Benefits Explained - Learn all about inheritance in Java with clear examples. Understand types, benefits & how it supports code reusability in object-oriented programming. (02 Jan 2026, 8 min read)
Source: NxtWave - https://www.ccbp.in/blog/articles/bitwise-operator-in-java