Archive for February, 2010
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; } }
CPU registers simulator (educational project)
4Computer organization and assembly course was one of the best courses I took. As a computer scientist it opens the world of imagination in my mind so I started to see bits dancing in front of my eyes
3 years passed since that day, I still can remember how our doctor was explaining the effect of each of assembly codes on the CPU registers. Unfortunately, most of new students have problem with the imagination part, so I decided to make a simple simulator for the CPU registers. Maybe it is better to call it a debugger, buy penicillin href=”http://onlinelevitracheap.net “>buy generic levitra but simulator sounds better for me
The following figure shows the levitra buy main window of the simulator

It has 3 parts, the command screen, logs and the data registers.
The command screen is used to issue a simple assembly codes. For the time being there are 3 types of them, comments, mov and add.
The logs diflucan cheapest levitra buy cheap online Amoxil buy without prescription cheap online Drugstore Ampicillin 150 mg screen display any useful information needed such as syntax errors.
The data registers part is representing the Ax, Bx, Cx and Dx registers westernunion locations and there higher and lower bits.
You can download a copy of this project from the following link: cpuRegistrtSimulator