Back to C Programming
2026-07-155 min read

bitwise operator in C

Learn bitwise operator in C step by step with clear examples and exercises.

Why This Matters

Welcome to this in-depth guide on bitwise operators in C programming! We'll delve into the world of low-level manipulation and understand how these powerful tools can help you solve complex problems, ace coding interviews, and even debug real-world bugs.

Why This Matters

Bitwise operators are essential for any serious C programmer to master. They enable direct manipulation of individual bits within data types, providing a level of control that's crucial in many low-level programming tasks. Understanding bitwise operations can help you:

  1. Optimize performance by performing calculations at the bit level instead of the usual arithmetic operations.
  2. Debug tricky problems by inspecting and modifying specific bits within memory.
  3. Solve interview questions that require a deep understanding of binary data manipulation.
  4. Gain insights into the inner workings of the CPU, making you a more effective problem solver.

Prerequisites

To fully appreciate this guide, you should have a solid foundation in C programming basics:

  1. Familiarity with C syntax and data types (int, char, etc.)
  2. Understanding of basic arithmetic and logical operators (+, -, *, /, ==, !=, etc.)
  3. Experience working with variables, functions, and control structures (if, for, while)
  4. Basic knowledge of memory management in C (pointers, arrays, dynamic allocation)

Core Concept

Understanding Binary Representation

Before diving into bitwise operators, let's quickly review binary numbers:

  1. Each digit in a binary number (base 2) is either 0 or 1.
  2. Binary numbers are represented as a sequence of bits. For example, 1010 is the binary representation of decimal number 10.
  3. The bits are ordered from right to left, with the rightmost bit being the least significant bit (LSB) and the leftmost bit being the most significant bit (MSB).

Bitwise AND (&)

The & operator performs a bit-by-bit comparison between two binary numbers. It sets the result bit to 1 only if both corresponding bits in the operands are 1:

int a = 0b1010; // Decimal 10
int b = 0b1101; // Decimal 13
int c = a & b; // Perform bitwise AND
printf("%d\n", c); // Output: 8 (binary 1000)

Bitwise OR (|)

The | operator sets the result bit to 1 if either of the corresponding bits in the operands is 1:

int a = 0b1010; // Decimal 10
int b = 0b1101; // Decimal 13
int c = a | b; // Perform bitwise OR
printf("%d\n", c); // Output: 19 (binary 10011)

Bitwise XOR (^)

The ^ operator sets the result bit to 1 if exactly one of the corresponding bits in the operands is 1:

int a = 0b1010; // Decimal 10
int b = 0b1101; // Decimal 13
int c = a ^ b; // Perform bitwise XOR
printf("%d\n", c); // Output: 7 (binary 0111)

Bitwise NOT (~)

The ~ operator flips all the bits of its operand. It changes every 1 to 0 and every 0 to 1:

int a = 0b1010; // Decimal 10
int b = ~a; // Perform bitwise NOT
printf("%d\n", b); // Output: -11 (binary 11010)

Shift Operators (<< and >>)

Shift operators move the bits of an integer to the left or right by a specified number of positions. The vacated positions are filled with zeros, while the sign bit remains unaffected during left shifts:

int a = 0b1010; // Decimal 10
int b = a << 2; // Shift bits 2 places to the left
printf("%d\n", b); // Output: 40 (binary 101000)

Worked Example

Let's create a program that implements a simple encryption algorithm using bitwise operations. We will XOR each byte of the plaintext with a key, and then shift the result by 2 positions:

#include <stdio.h>

void encrypt(char *plaintext, char *key, int length) {
for (int i = 0; i < length; ++i) {
plaintext[i] ^= key[i]; // Perform XOR operation on each byte
plaintext[i] <<= 2; // Shift the result 2 places to the left
}
}

int main() {
char plaintext[] = "Hello, World!";
char key[] = "SecretKey";

int length = sizeof(plaintext) / sizeof(plaintext[0]);
encrypt(plaintext, key, length);

printf("Encrypted message: ");
for (int i = 0; i < length; ++i) {
printf("%c", plaintext[i]);
}
printf("\n");

return 0;
}

Common Mistakes

  1. Forgetting to handle negative numbers when performing bitwise operations. Remember that the result of a bitwise operation on negative numbers will be negative, which might not align with your expectations.
  2. Not understanding the order of operations for bitwise operators. The bitwise operators have higher precedence than arithmetic and logical operators. This can lead to unintended results if you're not careful.
  3. Neglecting to handle edge cases when using shift operators. For example, shifting a signed integer by more than the number of bits in its type will cause undefined behavior.
  4. Misinterpreting the result of bitwise operations on non-binary data. Always ensure that your operands are binary numbers or properly converted before performing bitwise operations.

Practice Questions

  1. Write a program to find the common set bits between two integers using bitwise AND (&) and XOR (^).
  2. Implement a function to check if an integer is even or odd using only bitwise operators.
  3. Create a program that reverses the order of the bits in an unsigned integer using bitwise operations.
  4. Write a simple password-hashing algorithm using bitwise XOR and left shift (<<) operations.

FAQ

Why are bitwise operators important in C programming?

Bitwise operators provide low-level manipulation of individual bits within data types, which can lead to better performance, more effective debugging, and a deeper understanding of the CPU's inner workings.

What is the difference between &, |, and ^ in C programming?

& performs a bit-by-bit comparison, setting the result bit to 1 only if both corresponding bits in the operands are 1. | sets the result bit to 1 if either of the corresponding bits in the operands is 1. ^ sets the result bit to 1 if exactly one of the corresponding bits in the operands is 1.

How do I perform a right shift using the bitwise shift operators (<< and >>) in C?

To perform a right shift, use the >> operator. The vacated positions are filled with zeros during a right shift.

Can I combine bitwise AND (&) and OR (|) to achieve an inclusive OR operation?

Yes, you can combine bitwise AND (&) and OR (|) to create an inclusive OR operation by using the formula (a | b) & (a | b) + (~a & b). However, it's generally more efficient to use the built-in C function or (||) for this purpose.