import java.util.Scanner;
import java.util.Arrays;
import java.util.*;

public class Main
{
    public static void main(String[] args) 
    {
        int binaryWidth=32;
        int num;        
	int num1;        
	test t;        
        Scanner reader = new Scanner(System.in);        
	System.out.println("Enter a number no larger than: " + Math.pow(2,binaryWidth));
        num = reader.nextInt();
        
        do
        {
            System.out.println("Enter a number no larger than: " + Math.pow(2,binaryWidth));
            num1 = reader.nextInt();
            
        } while (num1<num);
        
        reader.close();
        
        int sizeArray = (num1-num)+1;
        
        System.out.println("Array to be created of size: " + sizeArray + " to hold decimals");
        System.out.println("Array to be created of size: " + sizeArray + " to hold decimals in binary form");
        System.out.println("\n");

        t= new test(num,num1,sizeArray);        
    }    
}

class test
{
    int binaryWidth=32;
    
    int binary[] = new int[binaryWidth];
    
    int j;
    int i;
    String conversion;
    int num;
    int sizeArray;
    int num1;
    int pos;    
    int [][]binaryRepository;    
    int k=0;
    boolean setBitOff=false;
        
    public void bitWiseAnd()
    {
        int[] bitWiseAndOutcome = new int[binaryWidth];
        for (int k=0; k<binaryWidth;k++)
        {
            System.out.println("Processing bit: " + k);
            
           for (int i=0; i<sizeArray; i++)
        {
            if (binaryRepository[i][k]==0)
            {
                System.out.println("0 bit found in column");
                
                
                setBitOff=true;
                
                if (k!=binaryWidth-1)
                {
                    System.out.println("Moving onto bit: " + (k+1));
                }
            }
                
            if (setBitOff)
            {
                
                bitWiseAndOutcome[k]=0;
                
                i=sizeArray;
            }
            
                       
            else
            {
                bitWiseAndOutcome[k]=1;
                System.out.println("All 1s found in column");
            }
    
        }        
        
        setBitOff=false;
    }  
        
        System.out.println("\nThis is bitwise And of the selected range of decimals:\n " + Arrays.toString(bitWiseAndOutcome));
        
    }
    
    public test(int num, int num1, int sizeArray)
    {
        this.sizeArray=sizeArray;
        this.num=num;
        this.num1=num1;
        int rangeDecimal[] = new int[sizeArray]; 
        binaryRepository = new int[sizeArray][binaryWidth];
        
        
        for (int i=0; i<sizeArray;i++)        {
                   
            rangeDecimal[i]=num+i;
            System.out.println("\n");
          
            System.out.println("The decimal number is: " + rangeDecimal[i]);
    
            int length = binary.length;
            System.out.println("*** This program will convert decimal " + rangeDecimal[i]+ " into binary");
            
            for (j=(length-1); j>=0; j--)
            {
                
                int divisor = (int)(Math.pow(2,j));

                if (rangeDecimal[i] - divisor >=0)
                {   
		    pos =  ((length-1)-j);
                    
                    binary[pos] = 1;                    
                    
                    binaryRepository[i][pos] = 1;
                    
                                        rangeDecimal[i]=rangeDecimal[i]-divisor;
                }
                else
                {
                    
                }
                
            }
            conversion = Arrays.toString(binary);
            System.out.println("Decimal is: " + (num+i));
            System.out.println("The binary version is : " + conversion );
            conversion=Arrays.toString(binaryRepository[i]);
            System.out.println("The binary in array is: " + conversion);
            
            
            binary=new int[binaryWidth];
        }
                bitWiseAnd();
        
    }
}