Related Articles

# Find the triplet from given Bitwise XOR and Bitwise AND values of all its pairs

• Last Updated : 10 Mar, 2021

Given six positive integers representing the Bitwise XOR and Bitwise AND of all possible pairs of a triplet (a, b, c), the task is to find the triplet.

Examples:

Input: aXORb = 30, aANDb = 0, aXORc = 10, aANDc = 20, aXORb = 20, aANDb = 10
Output: a = 10, b = 20, c= 30
Explanation:
If a = 10, b = 20, c= 30
a ^ b = 30, a & b = 0
a ^ c = 10, a & c = 20
a ^ b = 20, a & b = 10
Therefore, the required output is (a, b, c) = (10, 20, 30).

Input: aXORb = 3, aANDb = 0, aXORc = 2, aANDc = 1, aXORb = 1, aANDb = 2
Output: a = 1, b = 2, c = 3

Approach: The idea is to find the sum of every possible pairs of triplet using their Bitwise XOR and Bitwise AND values based on the following observations:

a + b = a ^ b + 2 * (a & b)

Follow the steps below to solve the problem:

• Find the sum of every possible pair of triplets i.e, (a + b, b + c, c + a) using the above formula.
• The value of a can be calculated as ((a + b) + (a + c) – (b + c)) / 2.
• The value of b can be calculated as ((a + b) – a).
• The value of c can be calculated as ((b + c) – b).
• Finally, print the value of the triplet (a, b, c).

Below is the implementation of the above approach:

## C++

 `// C++ program to implement``// the above approach` `#include ``using` `namespace` `std;` `// Function to find the triplet with given``// Bitwise XOR and Bitwise AND values of all``// possible pairs of the triplet``void` `findNumbers(``int` `aXORb, ``int` `aANDb, ``int` `aXORc, ``int` `aANDc,``                 ``int` `bXORc, ``int` `bANDc)``{``    ``// Stores values of``    ``// a triplet``    ``int` `a, b, c;` `    ``// Stores a + b``    ``int` `aSUMb;` `    ``// Stores a + c``    ``int` `aSUMc;` `    ``// Stores b + c``    ``int` `bSUMc;` `    ``// Calculate aSUMb``    ``aSUMb = aXORb + aANDb * 2;` `    ``// Calculate aSUMc``    ``aSUMc = aXORc + aANDc * 2;` `    ``// Calculate bSUMc``    ``bSUMc = bXORc + bANDc * 2;` `    ``// Calculate a``    ``a = (aSUMb - bSUMc + aSUMc) / 2;` `    ``// Calculate b``    ``b = aSUMb - a;` `    ``// Calculate c``    ``c = aSUMc - a;` `    ``// Print a``    ``cout << ``"a = "` `<< a;` `    ``// Print b``    ``cout << ``", b = "` `<< b;` `    ``// Print c``    ``cout << ``", c = "` `<< c;``}` `// Driver Code``int` `main()``{``    ``int` `aXORb = 30, aANDb = 0, aXORc = 20, aANDc = 10,``        ``bXORc = 10, bANDc = 20;` `    ``findNumbers(aXORb, aANDb, aXORc, aANDc, bXORc, bANDc);``}`

## Java

 `// Java program to implement``// the above approach``class` `GFG{` `// Function to find the triplet with given``// Bitwise XOR and Bitwise AND values of all``// possible pairs of the triplet``static` `void` `findNumbers(``int` `aXORb, ``int` `aANDb,``                        ``int` `aXORc, ``int` `aANDc,``                        ``int` `bXORc, ``int` `bANDc)``{``    ` `    ``// Stores values of``    ``// a triplet``    ``int` `a, b, c;` `    ``// Stores a + b``    ``int` `aSUMb;` `    ``// Stores a + c``    ``int` `aSUMc;` `    ``// Stores b + c``    ``int` `bSUMc;` `    ``// Calculate aSUMb``    ``aSUMb = aXORb + aANDb * ``2``;` `    ``// Calculate aSUMc``    ``aSUMc = aXORc + aANDc * ``2``;` `    ``// Calculate bSUMc``    ``bSUMc = bXORc + bANDc * ``2``;` `    ``// Calculate a``    ``a = (aSUMb - bSUMc + aSUMc) / ``2``;` `    ``// Calculate b``    ``b = aSUMb - a;` `    ``// Calculate c``    ``c = aSUMc - a;` `    ``// Print a``    ``System.out.print(``"a = "` `+ a);` `    ``// Print b``    ``System.out.print(``", b = "` `+ b);` `    ``// Print c``    ``System.out.print(``", c = "` `+ c);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `aXORb = ``30``, aANDb = ``0``,``        ``aXORc = ``20``, aANDc = ``10``,``        ``bXORc = ``10``, bANDc = ``20``;` `    ``findNumbers(aXORb, aANDb, aXORc,``                ``aANDc, bXORc, bANDc);``}``}` `// This code is contributed by 29AjayKumar`

## Python3

 `# Python program to implement``# the above approach` `# Function to find the triplet with given``# Bitwise XOR and Bitwise AND values of all``# possible pairs of the triplet``def` `findNumbers(aXORb, aANDb, aXORc, aANDc, bXORc, bANDc):` `    ``# Stores values of``    ``# a triplet``    ``a, b, c ``=` `0``, ``0``, ``0``;` `    ``# Stores a + b``    ``aSUMb ``=` `0``;` `    ``# Stores a + c``    ``aSUMc ``=` `0``;` `    ``# Stores b + c``    ``bSUMc ``=` `0``;` `    ``# Calculate aSUMb``    ``aSUMb ``=` `aXORb ``+` `aANDb ``*` `2``;` `    ``# Calculate aSUMc``    ``aSUMc ``=` `aXORc ``+` `aANDc ``*` `2``;` `    ``# Calculate bSUMc``    ``bSUMc ``=` `bXORc ``+` `bANDc ``*` `2``;` `    ``# Calculate a``    ``a ``=` `(aSUMb ``-` `bSUMc ``+` `aSUMc) ``/``/` `2``;` `    ``# Calculate b``    ``b ``=` `aSUMb ``-` `a;` `    ``# Calculate c``    ``c ``=` `aSUMc ``-` `a;` `    ``# Pra``    ``print``(``"a = "` `, a, end ``=` `"");` `    ``# Prb``    ``print``(``", b = "` `, b, end ``=` `"");` `    ``# Prc``    ``print``(``", c = "` `, c, end ``=` `"");`  `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``aXORb ``=` `30``; aANDb ``=` `0``; aXORc ``=` `20``; aANDc ``=` `10``; bXORc ``=` `10``; bANDc ``=` `20``;` `    ``findNumbers(aXORb, aANDb, aXORc, aANDc, bXORc, bANDc);` `# This code contributed by shikhasingrajput`

## C#

 `// C# code for above approach``using` `System;``public` `class` `GFG``{` `  ``// Function to find the triplet with given``  ``// Bitwise XOR and Bitwise AND values of all``  ``// possible pairs of the triplet``  ``static` `void` `findNumbers(``int` `aXORb, ``int` `aANDb,``                          ``int` `aXORc, ``int` `aANDc,``                          ``int` `bXORc, ``int` `bANDc)``  ``{` `    ``// Stores values of``    ``// a triplet``    ``int` `a, b, c;` `    ``// Stores a + b``    ``int` `aSUMb;` `    ``// Stores a + c``    ``int` `aSUMc;` `    ``// Stores b + c``    ``int` `bSUMc;` `    ``// Calculate aSUMb``    ``aSUMb = aXORb + aANDb * 2;` `    ``// Calculate aSUMc``    ``aSUMc = aXORc + aANDc * 2;` `    ``// Calculate bSUMc``    ``bSUMc = bXORc + bANDc * 2;` `    ``// Calculate a``    ``a = (aSUMb - bSUMc + aSUMc) / 2;` `    ``// Calculate b``    ``b = aSUMb - a;` `    ``// Calculate c``    ``c = aSUMc - a;` `    ``// Print a``    ``System.Console.Write(``"a = "` `+ a);` `    ``// Print b``    ``System.Console.Write(``", b = "` `+ b);` `    ``// Print c``    ``System.Console.Write(``", c = "` `+ c);``  ``}` `  ``// Driver code``  ``static` `public` `void` `Main ()``  ``{``    ``int` `aXORb = 30, aANDb = 0,``    ``aXORc = 20, aANDc = 10,``    ``bXORc = 10, bANDc = 20;` `    ``findNumbers(aXORb, aANDb, aXORc,``                ``aANDc, bXORc, bANDc);``  ``}``}` `// This code is contributed by offbeat.`

## Javascript

 ``
Output:
`a = 10, b = 20, c = 30`

Time Complexity: O(1)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up