Merge pull request #1328 from MohamedBechir/Development
Add hexadecimal to binary and hexadecimal to decimal conversions
This commit is contained in:
commit
9f8abb0f55
106
src/main/java/com/conversions/HexadecimalToBinary.java
Normal file
106
src/main/java/com/conversions/HexadecimalToBinary.java
Normal file
@ -0,0 +1,106 @@
|
||||
package com.conversions;
|
||||
|
||||
public class HexadecimalToBinary {
|
||||
/**
|
||||
* This method converts a hexadecimal number to
|
||||
* a binary number.
|
||||
*
|
||||
* @param hexStr The hexadecimal number
|
||||
* @return The binary number
|
||||
*/
|
||||
|
||||
public String hexToBin (String hexStr) {
|
||||
|
||||
String binaryString = "", hexaNumbers = "0123456789ABCDEF",
|
||||
DecimalStr ="", binaryStringBefore ="" , binaryStringAfter = "";
|
||||
int indexOfHex, decimalNumber = 0, k = 1, n =1, z=1, decimalNumberBefore = 0
|
||||
, decimalNumberAfter = 0;
|
||||
char letter;
|
||||
int binaryArray[] = new int [60];
|
||||
int binaryArrayBefore[] = new int [60];
|
||||
int binaryArrayAfter[] = new int [60];
|
||||
|
||||
hexStr = hexStr.toUpperCase();
|
||||
int pointPosition = hexStr.indexOf(".");
|
||||
/**
|
||||
* Transform the hexadecimal number to decimal number
|
||||
*/
|
||||
if ( pointPosition == -1) {
|
||||
for ( int i = 0 ; i < hexStr.length(); i++) {
|
||||
letter = hexStr.charAt(i);
|
||||
indexOfHex = hexaNumbers.indexOf(letter);
|
||||
decimalNumber = 16 * decimalNumber + indexOfHex;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for ( int i = 0 ; i < pointPosition ; i++) {
|
||||
letter = hexStr.charAt(i);
|
||||
indexOfHex = hexaNumbers.indexOf(letter);
|
||||
decimalNumberBefore = 16 * decimalNumberBefore + indexOfHex;
|
||||
}
|
||||
String decimalNumberBeforeStr = String.valueOf(decimalNumberBefore);
|
||||
|
||||
for ( int i = pointPosition+1 ; i < hexStr.length() ; i++) {
|
||||
letter = hexStr.charAt(i);
|
||||
indexOfHex = hexaNumbers.indexOf(letter);
|
||||
decimalNumberAfter = 16 * decimalNumberAfter + indexOfHex;
|
||||
}
|
||||
|
||||
String decimalNumberAfterStr = String.valueOf(decimalNumberAfter);
|
||||
|
||||
DecimalStr = decimalNumberBeforeStr + '.' + decimalNumberAfterStr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int pointPositionDec = DecimalStr.indexOf(".");
|
||||
/**
|
||||
* Check whether the result contains a floating point or not
|
||||
*/
|
||||
if (pointPositionDec == -1) {
|
||||
while (decimalNumber != 0) {
|
||||
binaryArray[k++] = decimalNumber % 2;
|
||||
decimalNumber = decimalNumber / 2;
|
||||
}
|
||||
|
||||
}else {
|
||||
/**
|
||||
* If it contains floating points we need to divide it into two parts before the point and after it
|
||||
*/
|
||||
while (decimalNumberBefore != 0) {
|
||||
binaryArrayBefore[z++] = decimalNumberBefore % 2;
|
||||
decimalNumberBefore = decimalNumberBefore / 2;
|
||||
}
|
||||
while (decimalNumberAfter != 0) {
|
||||
binaryArrayAfter[n++] = decimalNumberAfter % 2;
|
||||
decimalNumberAfter = decimalNumberAfter / 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(pointPositionDec == -1) {
|
||||
for ( int j = k-1 ; j>0 ; j--) {
|
||||
binaryString = binaryString + binaryArray[j];
|
||||
}
|
||||
}else {
|
||||
for ( int j = z-1 ; j>0 ; j--) {
|
||||
binaryStringBefore = binaryStringBefore + binaryArrayBefore[j];
|
||||
}
|
||||
|
||||
for ( int j = n-1 ; j>0 ; j--) {
|
||||
binaryStringAfter = binaryStringAfter + binaryArrayAfter[j];
|
||||
}
|
||||
/**
|
||||
* Remove the zeroes in the end of the hexadecimal
|
||||
*/
|
||||
binaryStringAfter = binaryStringAfter.replaceAll("0*$", "").replaceAll("\\.$", "");
|
||||
|
||||
|
||||
binaryString = binaryStringBefore + "." + binaryStringAfter;
|
||||
}
|
||||
|
||||
return binaryString;
|
||||
|
||||
}
|
||||
|
||||
}
|
68
src/main/java/com/conversions/HexadecimalToDecimal.java
Normal file
68
src/main/java/com/conversions/HexadecimalToDecimal.java
Normal file
@ -0,0 +1,68 @@
|
||||
package com.conversions;
|
||||
|
||||
|
||||
public class HexadecimalToDecimal {
|
||||
|
||||
/**
|
||||
* This method converts a Hexadecimal number to a decimal number
|
||||
*
|
||||
* @param hexadecimalStr
|
||||
* @return decimal number
|
||||
*/
|
||||
public String hexToDecimal(String hexaStr) {
|
||||
String hexaNumbers = "0123456789ABCDEF";
|
||||
int m, result = 0, decimalNumberBefore = 0, power = -1;
|
||||
Double decimalNumberAfter = 0.0;
|
||||
char letter;
|
||||
String decimalStr;
|
||||
hexaStr = hexaStr.toUpperCase();
|
||||
int pointPosition = hexaStr.indexOf(".");
|
||||
/**
|
||||
* Check whether the number contains a float point or not
|
||||
*/
|
||||
if ( pointPosition == -1) {
|
||||
for (int i = 0 ; i < hexaStr.length() ; i++) {
|
||||
/**
|
||||
* Letter will store the hexadecimal number as long as we loop through
|
||||
* the string
|
||||
*/
|
||||
letter = hexaStr.charAt(i);
|
||||
|
||||
/**
|
||||
* m is the index of the number that we are looping through in the
|
||||
* hexaNumbers
|
||||
*/
|
||||
m = hexaNumbers.indexOf(letter);
|
||||
result = 16*result + m;
|
||||
}
|
||||
decimalStr = String.valueOf(result);
|
||||
|
||||
}
|
||||
else {
|
||||
for ( int i = 0 ; i < pointPosition ; i++) {
|
||||
letter = hexaStr.charAt(i);
|
||||
m = hexaNumbers.indexOf(letter);
|
||||
decimalNumberBefore = 16*decimalNumberBefore + m;
|
||||
}
|
||||
|
||||
String decimalNumberBeforeStr = String.valueOf(decimalNumberBefore);
|
||||
|
||||
for ( int i = pointPosition+1 ; i < hexaStr.length() ; i++) {
|
||||
letter = hexaStr.charAt(i);
|
||||
m = hexaNumbers.indexOf(letter);
|
||||
decimalNumberAfter = (decimalNumberAfter + (Math.pow(16, power))*m);
|
||||
power = power-1;
|
||||
}
|
||||
/**
|
||||
* Retrieve the decimal part of the result
|
||||
*/
|
||||
String decimalNumberAfterStr = String.valueOf(decimalNumberAfter);
|
||||
int indexOfDecimal = decimalNumberAfterStr.indexOf(".");
|
||||
decimalNumberAfterStr = decimalNumberAfterStr.substring(indexOfDecimal);
|
||||
|
||||
decimalStr = decimalNumberBeforeStr + decimalNumberAfterStr;
|
||||
}
|
||||
|
||||
return decimalStr ;
|
||||
}
|
||||
}
|
30
src/test/java/com/conversions/HexadecimalToBinaryTest.java
Normal file
30
src/test/java/com/conversions/HexadecimalToBinaryTest.java
Normal file
@ -0,0 +1,30 @@
|
||||
package com.conversions;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class HexadecimalToBinaryTest {
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
//HexadecimaltTesting
|
||||
HexadecimalToBinary hexadecimalToBinary = new HexadecimalToBinary();
|
||||
Assertions.assertEquals("1011110011101111", hexadecimalToBinary.hexToBin("BCEF"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("10101101010101111001101", hexadecimalToBinary.hexToBin("56ABCD"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("10011101111011010001001", hexadecimalToBinary.hexToBin("4ef689"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("10011101111", hexadecimalToBinary.hexToBin("4EF"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("101010111100110111101111", hexadecimalToBinary.hexToBin("ABCDEF"), "Incorrect Conversion");
|
||||
//It returns -1 if you enter a wrong hexaDecimal
|
||||
Assertions.assertEquals("-1", hexadecimalToBinary.hexToBin("K"), "Incorrect Conversion");
|
||||
|
||||
|
||||
//Hexadecimal with floating point testing
|
||||
Assertions.assertEquals("101010111100.101111", hexadecimalToBinary.hexToBin("ABC.BC"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("10101101010.101111001101", hexadecimalToBinary.hexToBin("56A.BCD"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("1001110.1111011010001001", hexadecimalToBinary.hexToBin("4e.f689"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("1001110.1111", hexadecimalToBinary.hexToBin("4E.F"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("10101011110011011110.1111", hexadecimalToBinary.hexToBin("ABCDE.F"), "Incorrect Conversion");
|
||||
|
||||
}
|
||||
|
||||
}
|
32
src/test/java/com/conversions/HexadecimalToDecimalTest.java
Normal file
32
src/test/java/com/conversions/HexadecimalToDecimalTest.java
Normal file
@ -0,0 +1,32 @@
|
||||
package com.conversions;
|
||||
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
class HexadecimalToDecimalTest {
|
||||
|
||||
@Test
|
||||
void testHexadecimalToDecimalTest() {
|
||||
|
||||
HexadecimalToDecimal hexadecimalToDecimal = new HexadecimalToDecimal();
|
||||
|
||||
//HexadecimaltTesting
|
||||
Assertions.assertEquals("171", hexadecimalToDecimal.hexToDecimal("AB"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("5680077", hexadecimalToDecimal.hexToDecimal("56ABCD"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("5174921", hexadecimalToDecimal.hexToDecimal("4ef689"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("1263", hexadecimalToDecimal.hexToDecimal("4EF"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("11259375", hexadecimalToDecimal.hexToDecimal("ABCDEF"), "Incorrect Conversion");
|
||||
//It returns -1 if you enter a wrong hexaDecimal
|
||||
Assertions.assertEquals("-1", hexadecimalToDecimal.hexToDecimal("K"), "Incorrect Conversion");
|
||||
|
||||
//Hexadecimal with floating point testing
|
||||
Assertions.assertEquals("10.6875", hexadecimalToDecimal.hexToDecimal("A.B"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("1386.737548828125", hexadecimalToDecimal.hexToDecimal("56A.BCD"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("78.9630279541015625", hexadecimalToDecimal.hexToDecimal("4e.f689"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("0.93359375", hexadecimalToDecimal.hexToDecimal(".EF"), "Incorrect Conversion");
|
||||
Assertions.assertEquals("171.8044281005859375", hexadecimalToDecimal.hexToDecimal("AB.CDEF"), "Incorrect Conversion");
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user