Saturday, September 28, 2024
Google search engine
HomeData Modelling & AIPrint bitwise AND set of a number N

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:  

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)
 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments