// 23W.  java version of lab3bit.c 
import java.util.Scanner;

public class Lab3bit
{

 public static void main(String [] args) {
  Scanner scan = new Scanner(System.in);
  System.out.print("Enter a number (-1000 to quit): ");
  int abc;
  abc = scan.nextInt();

  while(abc != -1000)
  {		
     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(abc << 3); System.out.printf("  %d << 3\n", abc);
     printBinary(abc << 6); System.out.printf("  %d << 6\n\n", abc);

     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(~abc); System.out.printf("  ~%d\n\n", abc);


     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(1<<4);System.out.printf("  1<<4\n|\n"); printBinary( abc | (1<<4)); System.out.printf("  turn bit-4 on (keep others)\n\n\n");
   
     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(~(1<<4));System.out.printf("  ~(1<<4)\n&\n");printBinary( abc & ~(1<<4)); System.out.printf("  turn bit-4 off (keep others)\n\n\n");

     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(1<<4); System.out.printf("  1<<4\n&\n");printBinary( abc & (1<<4)); System.out.printf("  keep bit-4, turn off others\n\n\n");


     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(077);  System.out.printf("  077\n&\n");printBinary( abc & 077); System.out.printf("  keep lower 6 bits, turn off others\n\n\n");

     printBinary(abc); System.out.printf("  %d\n", abc);
     printBinary(~077); System.out.printf("  ~077\n&\n");printBinary( abc & ~077); System.out.printf("  turn lower 6 bits off, keep others\n\n\n");

     System.out.printf("Enter a number (-1000 to quit): ");
     abc = scan.nextInt(); // read again
  }

   System.out.printf("\n");
   int x = 0XFFFFFFFF;  // 11 .....1111
   printBinary(x ); System.out.printf("  0XFFFFFFFF\n");
   printBinary(x >> 3);  System.out.printf("  0XFFFFFFFF >> 3\n");   // add 111
   int x2 = 0XFFFFFFFF;   // 11 ......1111
   printBinary(x2 >>> 3); System.out.printf("  0XFFFFFFFF >>> 3\n");  // add 000  
   System.out.printf("\n");

} // end of main



 static void printBinary(int n ){
   final int SIZE = 32;  
   int cou = SIZE-1;
   int k[] = new int[SIZE];  

   while (n != 0 && cou >=0) { //added cou>=0 after Emily 2031ON o/w crash on ~abc on newer system (e.g.,win WSL or ubuntu 20)
      if ( (n & 1) !=0)
         k[cou]=1; //printf("1");
      else
         k[cou]=0; //printf("0");

      n >>= 1;
      cou--;
   }
   for(int i=0; i< SIZE;i++)
   {
      System.out.printf("%d", k[i]);
      if ((i+1)%8==0)
      {
         System.out.printf(" ");
      }
   }
 }

}
