Open In App

Print bitwise AND set of a number N

Improve
Improve
Like Article
Like
Save
Share
Report

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:  

C++




// 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




// 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.


Python3




# 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#




// 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.


Javascript




<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
// 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:  

C++




// 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




// 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.


Python3




# 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#




// 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.


Javascript




<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
// 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:

  1. Initialize an empty list res with 0 as the first element.
  2. Initialize a variable x as 1.
  3. 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.
  4. Return the final list res.
     

C++




#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;
}


Java




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 + " ");
        }
    }
}


Python3




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]


C#




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 + " ");
        }
    }
}


Javascript




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)
 



Last Updated : 02 Aug, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads