In this blog post, I will teach you how to write C/C++ program to find XOR of two number without using XOR Operator. After reading this detail guide post I believe you able to write an efficient program to find XOR of two number without using XOR Operator.
Examples:
Input: n1 = 5, n2 = 13 Output: 3
Let’s understand the above example with the help of their binary representation.
Input : n1 = 5 Here's a simple ASCII representation of 5 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | (Example bit values) +---+---+---+---+---+---+---+---+ Input : n2 = 13 Here's a simple ASCII representation of 5 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | (Example bit values) +---+---+---+---+---+---+---+---+ Now, n1 EX-OR n2 Output: 8 Here's a simple ASCII representation of 8 (an 8-bit integer): 7 6 5 4 3 2 1 0 (Bit position) +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | (Example bit values) +---+---+---+---+---+---+---+---+
Let’s see the problem statements for this question.
Problem Statement:
Given two integers, n1 and n2, the task is to find their XOR without using the XOR operator. i.e., without using ‘^’ in C/C++.
Disclaimer: Try to solve the problem yourself first otherwise it would be not worth solving this problem
Approach-1: Naive approach to find XOR of two number without using XOR Operator:
In the naive approach, we just follow the same concept which XOR Operator (^) does. i.e,
1. If the bits at the ith position are the same, we put 0 at that position.
2. Else if the bits at the ith position are different, we put 1 at that position.
C program to Find XOR of two number without using XOR Operator:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <stdio.h> //to use bool #include <stdbool.h> #define BITS_IN_INT sizeof(int)*8 //Make it 0 to enable second naive approach #if 1 // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { int ret = 0; // Initialize result for (int i = (BITS_IN_INT-1); i >= 0; i--) { // Find current bits in n1 and n2 bool b1 = n1 & (1 << i); bool b2 = n2 & (1 << i); // If both are 1 then 0 else xor is same as OR bool xoredBit = (b1 & b2) ? 0 : (b1 | b2); // Update result ret <<= 1; ret |= xoredBit; } return ret; } #else int myXOR(int n1, int n2) { int ret = 0; for (int i = 0; i < BITS_IN_INT; i++) { if (((1LL << i) & n1) != ((1LL << i) & n2)) { ret |= (1LL << i); } } return ret; } #endif int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); printf("XOR is %d\n", n1XORn2); return 0; }
Output: XOR is 8
C++ program to Find XOR of two number without using XOR Operator:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <iostream> //Bits in integer #define BITS_IN_INT sizeof(int)*8 //Make it 1 to enable first naive approach #if 0 // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { int ret = 0; // Initialize result for (int i = (BITS_IN_INT-1); i >= 0; i--) { // Find current bits in n1 and n2 bool b1 = n1 & (1 << i); bool b2 = n2 & (1 << i); // If both are 1 then 0 else xor is same as OR bool xoredBit = (b1 & b2) ? 0 : (b1 | b2); // Update result ret <<= 1; ret |= xoredBit; } return ret; } #else int myXOR(int n1, int n2) { int ret = 0; for (int i = 0; i < BITS_IN_INT; i++) { if (((1LL << i) & n1) != ((1LL << i) & n2)) { ret |= (1LL << i); } } return ret; } #endif int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); std::cout<<"XOR is "<< n1XORn2 <<std::endl; return 0; }
Output: XOR is 8
Approach-2: Using bitwise operators:
This approach is an optimize way in which you can find XOR without using a loop. You need to follow the following steps to get the XOR.
Step-1. First find all the bits where either ‘n1‘ or ‘n2‘ bits are set. You can get it by doing Oring between n1 and n2 (n1|n2)
.
Step-2. In the second steps you need to remove those set bits where both ‘n1‘ and ‘n2‘ are set. You can achieve this by ~n1 | ~n2
(performs a bitwise OR operation between the bitwise negations of n1 and n2).
Step-3. In the last you need to do Bitwise AND between the expressions what you have get in step 1 and 2 ((n1 | n2) & (~n1 | ~n2)
) to get the desired result.
C program to Find XOR of two number without using XOR Operator and loop:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <stdio.h> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 | n2) & (~n1 | ~n2); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); printf("XOR is %d\n", n1XORn2); return 0; }
Output: XOR is 8
- Time Complexity: O(1) i.e. simple calculation of arithmetic and bitwise operator.
- Auxiliary Space: O(1)
C++ program to Find XOR of two number without using XOR Operator and loop:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <iostream> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 | n2) & (~n1 | ~n2); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); std::cout<<"XOR is "<< n1XORn2 <<std::endl; return 0; }
Output: XOR is 8
- Time Complexity: O(1) i.e. simple calculation of arithmetic and bitwise operator.
- Auxiliary Space: O(1)
There is also one another solution to get the XOR of two numbers without XOR operator and loop. Consider the below code,
C code:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <stdio.h> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 & (~n2))|((~n1) & n2); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); printf("XOR is %d\n", n1XORn2); return 0; }
Output: XOR is 8
Complexity Analysis:
Time Complexity: O(1)
Space Complexity: O(1)
C++ code:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <iostream> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 & (~n2))|((~n1) & n2); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); std::cout<<"XOR is "<< n1XORn2 <<std::endl; return 0; }
Approach-3: (Using the XOR-AND-SUM Property)
You can simply use one of the well-known properties of XOR, i.e. ( n1+n2 = n1^n2 + 2*(n1&n2
). With the help of this you can find XOR between n1 and n2.
C code Using the XOR-AND-SUM Property:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <stdio.h> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 + n2) - (2 * (n1 & n2)); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); printf("XOR is %d\n", n1XORn2); return 0; }
Output: XOR is 8
Complexity Analysis:
Time Complexity: O(1)
Space Complexity: O(1)
C++ code Using the XOR-AND-SUM Property:
/* C program to find XOR of two number without using XOR Operator ^ */ #include <iostream> // Returns XOR of n1 and n2 int myXOR(int n1, int n2) { return (n1 + n2) - (2 * (n1 & n2)); } int main() { int n1 = 5, n2 = 13; const unsigned int n1XORn2 = myXOR(n1,n2); std::cout<<"XOR is "<< n1XORn2 <<std::endl; return 0; }
Recommended Post
- toggle the particular bits in given number.
- How to Set a Particular Bit in a number.
- turn off a particular bit.
- Count Set bits in an Integer.
- Turn off the rightmost set bit.
- Rotate bits of a number.
- Macros for Bit Manipulation in C/C++.
- 5 Ways to Check if Two Integers have Opposite Signs.
- Operator Precedence And Associativity In C.
- Operators in C language