Question

Given a (decimal - e.g. 3.72) number that is passed in as a string, print the binary representation.

If the number can not be represented accurately in binary, print “ERROR”

Solution

Convert the integer part is easy.

The difficulty is how to convert a floating point (the decimal part) to binary form. The idea suggested in the book is to keep x2, and subtract 1 when necessary. Eg.

0.625 x 2 = 1.25, append 1

0.25 x 2 = 0.5, append 0

0.5 x 2 = 1, append 1

the binary form of 0.625 would be 0.101.

We must declarify the max number of digits in the decimal part. In the book, the answer assumes a maximum digits of 32 bits (i.e. when binary length grows more than 32 bits, return “Error”).

Code

written by me

public static String printBinary(String n) {
    String[] num = n.split("\\.");
    int integer = Integer.parseInt(num[0]);
    double decimal = Double.parseDouble("0." + num[1]);

    // now convert decimal part, if can't convert, return ERROR
    StringBuilder sb = new StringBuilder();
    while (decimal != 0) {
        if (sb.length() > 32) {
            return "ERROR";
        }
        double newDoub = 2 * decimal;
        sb.append(newDoub >= 1 ? "1" : "0");
        decimal = newDoub % 1;
    }

    // now convert integer part
    String intStr = "";
    while (integer != 0) {
        intStr = ((integer & 1) == 1 ? "1" : "0") + intStr;
        integer = integer >> 1;
    }

    // return the 2 parts connected with a dot
    return intStr + "." + sb.toString();
}