Advertisement
joxaren

conv

Apr 11th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.53 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.math.BigInteger;
  5. import java.util.ArrayList;
  6. import java.util.LinkedList;
  7.  
  8. public class BinaryToDecimalConverter {
  9.  
  10.     public static void main(String[] args) {
  11.         BinaryToDecimalConverter conv = new BinaryToDecimalConverter();
  12.         conv.go();
  13.     }
  14.  
  15.  
  16.     private void go() {
  17.         try {
  18.             String userInput = getInput();
  19.             if (new BigInteger(userInput).compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0) {
  20.                 BigInteger number = new BigInteger(userInput);
  21.                 System.out.println(convertBinaryToDecimalBigInteger(number));
  22.             } else {
  23.                 long number = Long.parseLong(userInput);
  24.                 System.out.println(convertBinaryToDecimal(number));
  25.             }
  26.         } catch (NullPointerException ex) {
  27.             System.out.println("type a number next time, jackass.");
  28.         }
  29.     }
  30.  
  31.     /**
  32.      * gives ya a string of the input
  33.      */
  34.  
  35.     private static String getInput() {
  36.         String inputLine = null;
  37.         try {
  38.             BufferedReader reader = new BufferedReader(
  39.                     new InputStreamReader(System.in));
  40.             inputLine = reader.readLine();
  41.             if (inputLine.length() == 0) return null;
  42.         } catch (IOException ex) {
  43.             ex.printStackTrace();
  44.         }
  45.         return inputLine;
  46.     }
  47.  
  48.     private static long convertBinaryToDecimal(long number) {
  49.         ArrayList<Long> list = new ArrayList<>(); // a list of separate digits of the number being converted
  50.         LinkedList<Long> stack = new LinkedList<>(); // a stack used to put the digits onto the list in the right order after separating them
  51.  
  52.         while (number > 0) { // get separate digits of the number, put them on a stack
  53.             stack.push(number % 10);
  54.             number = number / 10;
  55.         }
  56.  
  57.         while (!stack.isEmpty()) { // put digits onto the list in correct order
  58.             list.add(stack.pop());
  59.         }
  60.  
  61.         long decimalNumber = 0;
  62.         int digits = list.size() - 1;
  63.         for (long item : list) { // converts into decimal using base-q expansion representation of the number
  64.             decimalNumber += item << digits;
  65.             digits--;
  66.         }
  67.         return decimalNumber;
  68.     }
  69.  
  70.     private static BigInteger convertBinaryToDecimalBigInteger(BigInteger number) {
  71.         ArrayList<BigInteger> list = new ArrayList<>(); // a list of separate digits of the number being converted
  72.         LinkedList<BigInteger> stack = new LinkedList<>(); // a stack used to put the digits onto the list in the right order after separating them
  73.  
  74.         while (number.compareTo(BigInteger.valueOf(0)) > 0) { // get separate digits of the number, put them on a stack
  75.             stack.push(number.mod(BigInteger.valueOf(10)));
  76.             number = number.divide(BigInteger.valueOf(10));
  77.         }
  78.  
  79.         while (!stack.isEmpty()) { // put digits onto the list in correct order
  80.             list.add(stack.pop());
  81.         }
  82.  
  83.         BigInteger decimalNumber = BigInteger.valueOf(0);
  84.         int digits = list.size() - 1;
  85.         BigInteger base = BigInteger.valueOf(2);
  86.         for (BigInteger item : list) {  // converts into decimal using base-q expansion representation of the number
  87.             BigInteger powerOfTwo = base.pow(digits);
  88.             decimalNumber = decimalNumber.add(item.multiply(powerOfTwo));
  89.             digits--;
  90.         }
  91.         return decimalNumber;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement