Given a positive integer n, count numbers x such that 0 < x <n and x^n > n where ^ is bitwise XOR operation.
Examples:
Input : n = 12 Output : 3 Numbers are 1, 2 and 3 1^12 > 12, 2^12 > 12 and 3^12 > 12 Input : n = 11 Output : 4 Numbers are 4, 5, 6 and 7
A number may x produce a greater XOR value if x has a set bit at a position where n has a 0 bit. So we traverse bits of n, and one by one consider all 0 bits. For every set bit at position k (Considering k = 0 for rightmost bit, k = 1 for second rightmost bit, ..), we add 2 2k to result. For a bit at k-th position, there are 2k numbers with set bit 1.
Below is the implementation of the above idea.
// C++ program to count numbers whose XOR with n
// produces a value more than n.
#include<bits/stdc++.h>
using namespace std;
int countNumbers(int n)
{
/* If there is a number like m = 11110000,
then it is bigger than 1110xxxx. x can either
0 or 1. So we have pow(2, k) greater numbers
where k is position of rightmost 1 in m. Now
by using XOR bit at each position can be changed.
To change bit at any position, it needs to XOR
it with 1. */
int k = 0; // Position of current bit in n
/* Traverse bits from LSB (least significant bit)
to MSB */
int count = 0; // Initialize result
while (n > 0)
{
// If current bit is 0, then there are
// 2^k numbers with current bit 1 and
// whose XOR with n produces greater value
if ((n&1) == 0)
count += pow(2, k);
// Increase position for next bit
k += 1;
// Reduce n to find next bit
n >>= 1;
}
return count;
}
// Driver code
int main()
{
int n = 11;
cout << countNumbers(n) << endl;
return 0;
}
// Java program to count numbers
// whose XOR with n produces a
// value more than n.
import java.lang.*;
class GFG {
static int countNumbers(int n)
{
// If there is a number like
// m = 11110000, then it is
// bigger than 1110xxxx. x
// can either be 0 or 1. So
// where k is the position of
// rightmost 1 in m. Now by
// using the XOR bit at each
// position can be changed.
// To change the bit at any
// position, it needs to
// XOR it with 1.
int k = 0;
// Position of current bit in n
// Traverse bits from LSB (least
// significant bit) to MSB
int count = 0;
// Initialize result
while (n > 0) {
// If the current bit is 0, then
// there are 2^k numbers with
// current bit 1 and whose XOR
// with n produces greater value
if ((n & 1) == 0)
count += (int)(Math.pow(2, k));
// Increase position for next bit
k += 1;
// Reduce n to find next bit
n >>= 1;
}
return count;
}
// Driver code
public static void main(String[] args)
{
int n = 11;
System.out.println(countNumbers(n));
}
}
// This code is contributed by Smitha.
# Python program to count numbers whose
# XOR with n produces a value more than n.
def countNumbers(n):
''' If there is a number like m = 11110000,
then it is bigger than 1110xxxx. x can either
0 or 1. So we have pow(2, k) greater numbers
where k is position of rightmost 1 in m. Now
by using XOR bit at each position can be changed.
To change bit at any position, it needs to XOR
it with 1. '''
# Position of current bit in n
k = 0
# Traverse bits from
# LSB to MSB
count = 0 # Initialize result
while (n > 0):
# If current bit is 0, then there are
# 2^k numbers with current bit 1 and
# whose XOR with n produces greater value
if ((n & 1) == 0):
count += pow(2, k)
# Increase position for next bit
k += 1
# Reduce n to find next bit
n >>= 1
return count
# Driver code
n = 11
print(countNumbers(n))
# This code is contributed by Anant Agarwal.
// C# program to count numbers
// whose XOR with n produces a
// value more than n.
using System;
class GFG {
static int countNumbers(int n)
{
// If there is a number like
// m = 11110000, then it is
// bigger than 1110xxxx. x
// can either be 0 or 1. So
// where k is the position of
// rightmost 1 in m. Now by
// using the XOR bit at each
// position can be changed.
// To change the bit at any
// position, it needs to
// XOR it with 1.
int k = 0;
// Position of current bit in n
// Traverse bits from LSB (least
// significant bit) to MSB
int count = 0;
// Initialize result
while (n > 0) {
// If the current bit is 0, then
// there are 2^k numbers with
// current bit 1 and whose XOR
// with n produces greater value
if ((n & 1) == 0)
count += (int)(Math.Pow(2, k));
// Increase position for next bit
k += 1;
// Reduce n to find next bit
n >>= 1;
}
return count;
}
// Driver code
public static void Main()
{
int n = 11;
Console.WriteLine(countNumbers(n));
}
}
// This code is contributed by Anant Agarwal.
<?php
// PHP program to count
// numbers whose XOR with n
// produces a value more than n.
function countNumbers($n)
{
/* If there is a number
like m = 11110000,
then it is bigger
than 1110xxxx. x
can either 0 or 1.
So we have pow(2, k)
greater numbers where
k is position of
rightmost 1 in m.
Now by using XOR bit
at each position can
be changed. To change
bit at any position,
it needs to XOR it
with 1. */
// Position of current bit in n
$k = 0;
/* Traverse bits from LSB
(least significant bit)
to MSB */
// Initialize result
$count = 0;
while ($n > 0)
{
// If current bit is 0,
// then there are 2^k
// numbers with current
// bit 1 and whose XOR
// with n produces greater
// value
if (($n & 1) == 0)
$count += pow(2, $k);
// Increase position
// for next bit
$k += 1;
// Reduce n to
// find next bit
$n >>= 1;
}
return $count;
}
// Driver code
$n = 11;
echo countNumbers($n);
// This code is contributed by anuj_67.
?>
<script>
// Javascript program to count numbers whose XOR with n
// produces a value more than n.
function countNumbers(n)
{
// If there is a number like
// m = 11110000, then it is
// bigger than 1110xxxx. x
// can either be 0 or 1. So
// where k is the position of
// rightmost 1 in m. Now by
// using the XOR bit at each
// position can be changed.
// To change the bit at any
// position, it needs to
// XOR it with 1.
let k = 0;
// Position of current bit in n
// Traverse bits from LSB (least
// significant bit) to MSB
let count = 0;
// Initialize result
while (n > 0) {
// If the current bit is 0, then
// there are 2^k numbers with
// current bit 1 and whose XOR
// with n produces greater value
if ((n & 1) == 0)
count += (Math.pow(2, k));
// Increase position for next bit
k += 1;
// Reduce n to find next bit
n >>= 1;
}
return count;
}
// Driver Code
let n = 11;
document.write(countNumbers(n));
</script>
Output:
4
Time complexity: O(logn)
Auxiliary Space: O(1)