Posts tagged from
Binary, Octal, Decimal and Hexadecimal converter(Java)
0I 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; } }