I was working on a simple project that simulate CPU registers, where users can use an assembly-like commands to issue some process while watching changes on the virtual CPU registers.

you may visit it using this link: http://www.doitmyway.net/2010/02/21/cpu-registers-simulator-educational-project/

In fact CPU data are in binary, although users may want to read those data in different format. So I implemented a simple Java class to convert numbers from/to binary, octal, decimal and hexadecimal.

There are 6 main functions:

  • decToBin
  • binToDec
  • octToBin
  • binToOct
  • hexToBin
  • binToHex

The other functions are supporting functions or functions based on the main functions, e.g, decToHex is a combination of decToBin and binToHex.

baseConvertor.java

//DoItMyWay.net
//a7med.yamani@gmail.com
//licensed under gpl v3 :)
 
package cpuregsim;
 
public class baseConvertor {
 
    //reverse string, give it "abc" and it will returns "cba"
    public String reverseString(String str) {
        str = str.trim();
        int strl = str.length();
        if (strl > 1) {
            StringBuffer sb = new StringBuffer();
            for (int i = strl - 1; i >= 0; i--) {
                sb.append(str.charAt(i) + "");
            }
            return sb.toString();
        }
        return str;
    }
 
    //convert decimal to hex
    public String decToHex(String dec) {
        return binToHex(decToBin(dec));
    }
 
    //convert decimal to oct
    public String decToOct(String dec) {
        return binToOct(decToBin(dec));
    }
 
    //convert decimal to bin
    public String decToBin(String dec) {
        if (!isDecimal(dec)) {
            return "Invalid input!";
        }
        int val = Integer.parseInt(dec);
        if (val == 0) {
            return "0";
        }
        StringBuffer bin = new StringBuffer();
        for (; val != 1; val = val / 2) {
            bin.append((val % 2) + "");
        }
        bin.append("1");
        return reverseString(bin.toString());
    }
 
    //convert oct to decimal
    public String octToDec(String oct) {
        return binToDec(octToBin(oct));
    }
 
    //convert oct to hex
    public String octToHex(String oct) {
        return binToHex(octToBin(oct));
    }
 
    //convert oct to bin
    public String octToBin(String oct) {
        if (!isOctal(oct)) {
            return "Invalid input!";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < oct.length(); i++) {
            if (oct.charAt(i) == '0') {
                sb.append("000");
            } else if (oct.charAt(i) == '1') {
                sb.append("001");
             } else if (oct.charAt(i) == '2') {
                sb.append("010");
            } else if (oct.charAt(i) == '3') {
                sb.append("011");
            } else if (oct.charAt(i) == '4') {
                sb.append("100");
             } else if (oct.charAt(i) == '5') {
                sb.append("101");
            } else if (oct.charAt(i) == '6') {
                sb.append("110");
            } else if (oct.charAt(i) == '7') {
                sb.append("111");
            }
        }
        return Long.parseLong(sb.toString()) + "";
    }
 
    //convert hex to decimal
    public String hexToDec(String hex) {
        return binToDec(hexToBin(hex));
    }
 
    //convert hex to oct
    public String hexToOct(String hex) {
        return binToOct(hexToBin(hex));
    }
 
    //convert hex to bin
    public String hexToBin(String hex) {
        hex = hex.toUpperCase();
        if (!isHexaDecimal(hex)) {
            return "Invalid input!";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < hex.length(); i++) {
            if (hex.charAt(i) == '0') {
                sb.append("0000");
            } else if (hex.charAt(i) == '1') {
                sb.append("0001");
            } else if (hex.charAt(i) == '2') {
                sb.append("0010");
            } else if (hex.charAt(i) == '3') {
                sb.append("0011");
            } else if (hex.charAt(i) == '4') {
                sb.append("0100");
            } else if (hex.charAt(i) == '5') {
                sb.append("0101");
            } else if (hex.charAt(i) == '6') {
                sb.append("0110");
            } else if (hex.charAt(i) == '7') {
                sb.append("0111");
            } else if (hex.charAt(i) == '8') {
                sb.append("1000");
            } else if (hex.charAt(i) == '9') {
                sb.append("1001");
            } else if (hex.charAt(i) == 'A') {
                sb.append("1010");
            } else if (hex.charAt(i) == 'B') {
                sb.append("1011");
            } else if (hex.charAt(i) == 'C') {
                sb.append("1100");
            } else if (hex.charAt(i) == 'D') {
                sb.append("1101");
            } else if (hex.charAt(i) == 'E') {
                sb.append("1110");
            } else if (hex.charAt(i) == 'F') {
                sb.append("1111");
            }
        }
        return Long.parseLong(sb.toString()) + "";
    }
 
    //is input represents a Binary number
    public boolean isBinary(String bin) {
        return bin.matches("[0|1]+");
 
    }
 
    //is input represents a Octal number
    public boolean isOctal(String bin) {
        return bin.matches("[0-7]+");
 
    }
 
    //is input represents a Hexadecimal number
    public boolean isHexaDecimal(String bin) {
        return bin.toUpperCase().matches("[0-9|A-F]+");
 
    }
 
    //is input represents a decimal number
    public boolean isDecimal(String bin) {
        return bin.matches("[0-9]+");
 
    }
 
    //convert bin to decimal
    public String binToDec(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        int nOfDigits = bin.length();
        int val = 0;
        bin = reverseString(bin);
        for (int i = 0; i < nOfDigits; i++) {
            try {
                val = val + Integer.parseInt(bin.charAt(i) + "") * ((int) Math.pow(2, i));
            } catch (NumberFormatException nfe) {
                return "Invalid input!";
            }
        }
        return val + "";
    }
 
    //convert bin to oct
    public String binToOct(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        String[] tokens = splitByWidth(bin, 3, '0');
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("000")) {
                sb.append("0");
            } else if (tokens[i].equals("001")) {
                sb.append("1");
            } else if (tokens[i].equals("010")) {
                sb.append("2");
            } else if (tokens[i].equals("011")) {
                sb.append("3");
            } else if (tokens[i].equals("100")) {
                sb.append("4");
            } else if (tokens[i].equals("101")) {
                sb.append("5");
            } else if (tokens[i].equals("110")) {
                sb.append("6");
            } else if (tokens[i].equals("111")) {
                sb.append("7");
            }
        }
  return sb.toString();
    }
 
    //convert bin to hex
    public String binToHex(String bin) {
        if (!isBinary(bin)) {
            return "Invalid input!";
        }
        String[] tokens = splitByWidth(bin, 4, '0');
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("0000")) {
                sb.append("0");
            } else if (tokens[i].equals("0001")) {
                sb.append("1");
            } else if (tokens[i].equals("0010")) {
                sb.append("2");
            } else if (tokens[i].equals("0011")) {
                sb.append("3");
            } else if (tokens[i].equals("0100")) {
                sb.append("4");
            } else if (tokens[i].equals("0101")) {
                sb.append("5");
            } else if (tokens[i].equals("0110")) {
                sb.append("6");
            } else if (tokens[i].equals("0111")) {
                sb.append("7");
            } else if (tokens[i].equals("1000")) {
                sb.append("8");
            } else if (tokens[i].equals("1001")) {
                sb.append("9");
            } else if (tokens[i].equals("1010")) {
                sb.append("A");
            } else if (tokens[i].equals("1011")) {
                sb.append("B");
            } else if (tokens[i].equals("1100")) {
                sb.append("C");
            } else if (tokens[i].equals("1101")) {
                sb.append("D");
            } else if (tokens[i].equals("1110")) {
                sb.append("E");
            } else if (tokens[i].equals("1111")) {
                sb.append("F");
            }
        }
        return sb.toString();
    }
 
    //split string by specified width and fill empty spaces
    public String[] splitByWidth(String str, int width, char fillChar) {
        String[] list = null;
        int strLen = str.length();
        StringBuffer sb = new StringBuffer(reverseString(str));
        int mod = strLen % width;
        if (!(mod == 0)) {
            for (int i = 0; i < width - mod; i++) {
                sb.append(fillChar);
            }
        }
        strLen = sb.length();
        list = new String[strLen / width];
        sb = new StringBuffer(reverseString(sb.substring(0)));
        StringBuffer tmp = new StringBuffer();
        int listCounter = 0;
        for (int i = 0; i < strLen; i++) {
            if (i % width == 0 && i != 0) {
                list[listCounter] = tmp.toString();
                listCounter++;
                tmp = new StringBuffer();
            }
            tmp.append(sb.charAt(i));
        }
        list[listCounter] = tmp.toString();
        listCounter++;
        return list;
    }
}