Print bitwise AND set of a number N
Given a number N, print all the numbers which are a bitwise AND set of the binary representation of N. Bitwise AND set of a number N is all possible numbers x smaller than or equal N such that N & i is equal to x for some number i.
Examples :
Input : N = 5
Output : 0, 1, 4, 5
Explanation: 0 & 5 = 0
1 & 5 = 1
2 & 5 = 0
3 & 5 = 1
4 & 5 = 4
5 & 5 = 5
So we get 0, 1, 4 and 5 in the
bitwise subsets of N.
Input : N = 9
Output : 0, 1, 8, 9
Simple Approach: A naive approach is to iterate from all numbers from 0 to N and check if (N&i == i). Print the numbers which satisfy the specified condition.
Below is the implementation of above idea:
// CPP program to print all bitwise
// subsets of N (Naive approach)
#include <bits/stdc++.h>
using namespace std;
// function to find bitwise subsets
// Naive approach
void printSubsets(int n) {
for (int i = 0; i <= n; i++)
if ((n & i) == i)
cout << i << " ";
}
// Driver Code
int main() {
int n = 9;
printSubsets(n);
return 0;
}
// JAVA program to print all bitwise
// subsets of N (Naive approach)
class GFG {
// function to find bitwise subsets
// Naive approach
static void printSubsets(int n)
{
for (int i = 0; i <= n; i++)
if ((n & i) == i)
System.out.print(i + " ");
}
// Driver function
public static void main(String[] args)
{
int n = 9;
printSubsets(n);
}
}
// This code is contributed by Anant Agarwal.
# Python program to print all bitwise
# subsets of N (Naive approach)
def printSubsets(n):
for i in range(n + 1):
if ((n & i) == i):
print(i ," ", end = "")
# Driver code
n = 9
printSubsets(n)
# This code is contributed by Anant Agarwal.
// C# program to print all bitwise
// subsets of N (Naive approach)
using System;
class GFG {
// function to find bitwise subsets
// Naive approach
static void printSubsets(int n)
{
for (int i = 0; i <= n; i++)
if ((n & i) == i)
Console.Write(i + " ");
}
// Driver function
public static void Main()
{
int n = 9;
printSubsets(n);
}
}
// This code is contributed by vt_m.
<script>
// JavaScript program to print all bitwise
// subsets of N (Efficient approach)
// function to find bitwise
// subsets Efficient approach
function printSubsets(n)
{
for (let i = n; i > 0; i = (i - 1) & n)
document.write(i + " ");
document.write(" 0 ");
}
// Driver code
let n = 9;
printSubsets(n);
// This code is contributed by souravghosh0416.
</script>
<?php
// PHP program to print all bitwise
// subsets of N (Naive approach)
// function to find bitwise subsets
// Naive approach
function printSubsets($n)
{
for ($i = 0; $i <= $n; $i++)
if (($n & $i) == $i)
echo $i." ";
}
// Driver Code
$n = 9;
printSubsets($n);
// This code is contributed by mits
?>
Output
0 1 8 9
Time Complexity : O(N)
Efficient Solution: An efficient solution is to use bitwise operators to find the subsets. Instead of iterating for every i, we can simply iterate for the bitwise subsets only. Iterating backward for i=(i-1)&n gives us every bitwise subset, where i starts from n and ends at 1.
Below is the implementation of above idea:
// CPP program to print all bitwise
// subsets of N (Efficient approach)
#include <bits/stdc++.h>
using namespace std;
// function to find bitwise subsets
// Efficient approach
void printSubsets(int n) {
for (int i = n; i > 0; i = (i - 1) & n)
cout << i << " ";
cout << 0;
}
// Driver Code
int main() {
int n = 9;
printSubsets(n);
return 0;
}
// Java program to print all bitwise
// subsets of N (Efficient approach)
class GFG
{
// function to find bitwise
// subsets Efficient approach
static void printSubsets(int n)
{
for (int i = n; i > 0; i = (i - 1) & n)
System.out.print(i + " ");
System.out.print(" 0 ");
}
// Driver Code
public static void main(String[] args)
{
int n = 9;
printSubsets(n);
}
}
// This code is contributed by ajit.
# Python 3 program to
# print all bitwise
# subsets of N
# (Efficient approach)
# function to find
# bitwise subsets
# Efficient approach
def printSubsets(n):
i=n
while(i != 0):
print(i,end=" ")
i=(i - 1) & n
print("0")
# Driver Code
n = 9
printSubsets(n)
# This code is contributed by
# Smith Dinesh Semwal
// C# program to print all bitwise
// subsets of N (Efficient approach)
using System;
public class GFG {
// function to find bitwise subsets
// Efficient approach
static void printSubsets(int n) {
for (int i = n; i > 0; i = (i - 1) & n)
Console.Write(i +" ");
Console.WriteLine("0");
}
// Driver Code
static public void Main () {
int n = 9;
printSubsets(n);
}
}
// This code is contributed by vt_m.
<script>
// Javascript program to print all bitwise
// subsets of N (Efficient approach)
// Function to find bitwise subsets
// Efficient approach
function printSubsets(n)
{
for(let i = n; i > 0; i = (i - 1) & n)
document.write(i +" ");
document.write("0" + "</br>");
}
// Driver code
let n = 9;
printSubsets(n);
// This code is contributed by divyesh072019
</script>
<?php
// PHP program to print all bitwise
// subsets of N (Efficient approach)
// function to find bitwise subsets
// Efficient approach
function printSubsets($n)
{
for ($i = $n; $i > 0;
$i = ($i - 1) & $n)
echo $i." ";
echo "0";
}
// Driver Code
$n = 9;
printSubsets($n);
// This code is contributed by mits
?>
Output
9 8 1 0
Output :
9 8 1 0
Time Complexity: O(K), where K is the number of bitwise subsets of N.
Approach: Optimized Bit Manipulation
Steps:
- Initialize an empty list res with 0 as the first element.
- Initialize a variable x as 1.
- While x is less than or equal to N, do the following:
a. If the x-th bit of N is 1, then for each element r in res, append r | x to res.
b. Multiply x by 2. - Return the final list res.
#include <iostream>
#include <vector>
using namespace std;
vector<int> bitwise_and_set(int N) {
vector<int> res = {0};
int x = 1;
while (x <= N) {
if (N & x) {
vector<int> temp;
for (int r : res) {
temp.push_back(r | x);
}
res.insert(res.end(), temp.begin(), temp.end());
}
x <<= 1;
}
return res;
}
int main() {
int N = 5;
vector<int> result = bitwise_and_set(N);
for (int r : result) {
cout << r << " ";
}
return 0;
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static List<Integer> bitwiseAndSet(int N) {
List<Integer> res = new ArrayList<>();
res.add(0);
int x = 1;
while (x <= N) {
if ((N & x) != 0) {
List<Integer> temp = new ArrayList<>();
for (int r : res) {
temp.add(r | x);
}
res.addAll(temp);
}
x <<= 1;
}
return res;
}
public static void main(String[] args) {
int N = 5;
List<Integer> result = bitwiseAndSet(N);
for (int r : result) {
System.out.print(r + " ");
}
}
}
def bitwise_and_set(N):
res = [0]
x = 1
while x <= N:
if N & x:
res += [r | x for r in res]
x <<= 1
return res
# Example Usage
N = 5
print(bitwise_and_set(N)) # Output: [0, 1, 4, 5]
using System;
using System.Collections.Generic;
public class Program {
public static List<int> BitwiseAndSet(int N) {
List<int> res = new List<int> {0};
int x = 1;
while (x <= N) {
if ((N & x) != 0) {
List<int> temp = new List<int>();
foreach (int r in res) {
temp.Add(r | x);
}
res.AddRange(temp);
}
x <<= 1;
}
return res;
}
public static void Main() {
int N = 5;
List<int> result = BitwiseAndSet(N);
foreach (int r in result) {
Console.Write(r + " ");
}
}
}
function bitwiseAndSet(N) {
var res = [0]; // Initialize the result array with 0
var x = 1; // Initialize x as 1
while (x <= N) { // Loop while x is less than or equal to N
if (N & x) { // If the bitwise AND of N and x is non-zero
var temp = []; // Create a temporary array
for (var r of res) { // Iterate over the elements of res array
temp.push(r | x); // Perform bitwise OR operation and add the result to temp array
}
res = res.concat(temp); // Concatenate temp array to res array
}
x <<= 1; // Left shift x by 1
}
return res; // Return the resulting array
}
var N = 5;
var result = bitwiseAndSet(N);
for (var r of result) { // Iterate over the elements of result array
console.log(r + " "); // Print each element followed by a space
}
Output
0 1 4 5
Time Complexity: O(log N)
Auxiliary Space: O(2^log N)