Count set bits in Bitwise XOR of all adjacent elements upto N
Last Updated :
10 Jun, 2021
Given a positive integer N, the task is to find the total count of set bits by performing Bitwise XOR on all possible adjacent elements in the range [0, N].
Examples:
Input: N = 4
Output: 7
Explanation:
Bitwise XOR of 0 and 1 = 001 and count of set bits = 1
Bitwise XOR of 1 and 2 = 011 and count of set bits = 2
Bitwise XOR of 2 and 3 = 001 and count of set bits = 1
Bitwise XOR of 3 and 4 = 111 and count of set bits = 3
Therefore, the total count of set bits by performing the XOR operation on all possible adjacent elements of the range [0, N] = (1 + 2 + 1 + 3) = 7
Input: N = 7
Output: 11
Naive Approach: The simplest approach to solve this problem is to iterate over the range [0, N] and count all possible set bits by performing Bitwise XOR on each adjacent element over the range [0, N]. Finally, print the total count of all possible set bits.
Time Complexity: O(N * log2N)
Auxiliary Space: O(1)
Efficient approach: To optimize the above approach, the idea is based on the following observations:
If the position of the rightmost set bit of X is K, then the count of set bits in (X ^ (X – 1)) must be K.
Follow the steps below to solve the problem:
- Initialize a variable, say bit_position to store all possible values of the right most bit over the range [0, N].
- Initialize a variable, say total_set_bits to store the sum of all possible set bits by performing the Bitwise XOR operation on all possible adjacent elements over the range [0, N].
- Iterate over the range [0, N] and Update N = N – (N + 1) / 2 and total_set_bits += ((N + 1) / 2 * bit_position).
- Finally, print the value of total_set_bits.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countXORSetBitsAdjElemRange1_N( int N)
{
int total_set_bits = 0;
int bit_Position = 1;
while (N) {
total_set_bits += ((N + 1) / 2
* bit_Position);
N -= (N + 1) / 2;
bit_Position++;
}
return total_set_bits;
}
int main()
{
int N = 4;
cout << countXORSetBitsAdjElemRange1_N(N);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG{
static int countXORSetBitsAdjElemRange1_N( int N)
{
int total_set_bits = 0 ;
int bit_Position = 1 ;
while (N != 0 )
{
total_set_bits += ((N + 1 ) / 2 *
bit_Position);
N -= (N + 1 ) / 2 ;
bit_Position++;
}
return total_set_bits;
}
public static void main(String[] args)
{
int N = 4 ;
System.out.println(countXORSetBitsAdjElemRange1_N(N));
}
}
|
Python3
def countXORSetBitsAdjElemRange1_N(N):
total_set_bits = 0
bit_Position = 1
while (N):
total_set_bits + = ((N + 1 ) / /
2 * bit_Position)
N - = (N + 1 ) / / 2
bit_Position + = 1
return total_set_bits
if __name__ = = '__main__' :
N = 4
print (countXORSetBitsAdjElemRange1_N(N))
|
C#
using System;
class GFG{
static int countXORSetBitsAdjElemRange1_N( int N)
{
int total_set_bits = 0;
int bit_Position = 1;
while (N != 0)
{
total_set_bits += ((N + 1) / 2 *
bit_Position);
N -= (N + 1) / 2;
bit_Position++;
}
return total_set_bits;
}
public static void Main()
{
int N = 4;
Console.Write(countXORSetBitsAdjElemRange1_N(N));
}
}
|
Javascript
<script>
function countXORSetBitsAdjElemRange1_N(N)
{
let total_set_bits = 0;
let bit_Position = 1;
while (N) {
total_set_bits += (Math.floor((N + 1) / 2) * bit_Position);
N -= Math.floor((N + 1) / 2);
bit_Position++;
}
return total_set_bits;
}
let N = 4;
document.write(countXORSetBitsAdjElemRange1_N(N));
</script>
|
Time complexity:O(Log2N)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...