Count smaller values whose XOR with x is greater than x

Given a integer ‘x’, find the number of values of ‘a’ satisfying the following conditions:

  1. a XOR x > x
  2. 0 < a < x

Examples:

Input : x = 10 
Output : 5
Explanation: For x = 10, following 5 values
             of 'a' satisfy the conditions:
             1 XOR 10 = 11
             4 XOR 10 = 14
             5 XOR 10 = 15
             6 XOR 10 = 12
             7 XOR 10 = 13 

Input : x = 2
Output : 1
Explanation: For x=2, we have just one value
             1 XOR 2 = 3.

Naive Approach
A Simple approach is to check for all values of ‘a’ between 0 and ‘x’ and calculate its XOR with x
and check if the condition 1 satisfies.

C++

// C++ program to find count of values
// whose XOR with x is greater than x
// and values are smaller than x
#include<bits/stdc++.h>
using namespace std;

int countValues(int x)
{
    int count = 0;
    for (int i=1; i < x; i++)
        if ((i ^ x) > x)
            count++;
    return count;
}

// Driver code
int main()
{
    int x = 10;
    cout << countValues(x);
    return 0;
}

Java

// Java program to find count of values
// whose XOR with x is greater than x
// and values are smaller than x

public class XOR
{
    static int countValues(int x)
    {
        int count = 0;
        for (int i=1; i < x; i++)
            if ((i ^ x) > x)
                count++;
        return count;
    }
    
    public static void main (String[] args)
    {
        int x = 10;
        System.out.println(countValues(x));
    }
}

// This code is contributed by Saket Kumar


Output :
5

The time complexity of the above approach is O(x).

Efficient Approach
Efficient solution lies in binary representation of the number. We consider all 0’s in binary representation. For every 0 at i-th position, we can have 2i numbers smaller than or equal to x with greater XOR.

C++

// C++ program to find count of values
// whose XOR with x is greater than x
// and values are smaller than x
#include<bits/stdc++.h>
using namespace std;

int countValues(int x)
{
    // Initialize result
    int count = 0, n = 1;

    // Traversing through all bits of x
    while (x != 0)
    {
        // If current last bit of x is set
        // then increment count by n. Here
        // n is a power of 2 corresponding
        // to position of bit
        if (x%2 == 0)
            count += n;

        // Simultaneously calculate the 2^n
        n *= 2;

        // Replace x with x/2;
        x /= 2;
    }

    return count;
}

// Driver code
int main()
{
    int x = 10;
    cout << countValues(x);
    return 0;
}

Java

// Java program to find count of values
// whose XOR with x is greater than x
// and values are smaller than x

public class XOR
{
    static int countValues(int x)
    {
        // Initialize result
        int count = 0, n = 1;
        
        // Traversing through all bits of x
        while (x != 0)
        {
            // If current last bit of x is set
		    // then increment count by n. Here
		    // n is a power of 2 corresponding
		    // to position of bit
		    if (x%2 == 0)
		        count += n;
		        
		    // Simultaneously calculate the 2^n
		    n *= 2;
		    
		    // Replace x with x/2;
		    x /= 2;
        }
        return count;
    }
    
    public static void main (String[] args)
    {
        int x = 10;
        System.out.println(countValues(x));
    }
    
}

// This code is contributed by Saket Kumar


Output:

 5

Time complexity of this solution is O(Log x)

This article is contributed by DANISH KALEEM. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Recommended Posts:







Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.