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)