Меня не устраивает огромное полотно if / else. Ниже я привёл свой код на критику, не жайлете, пожалуйста, букв))
package com.company;
public class Main {
public static void main(String[] args) {
String binaryNumber = "100111010000";
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
String hexNumber = "9d0";
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
}
public static String toHex(String binaryNumber) {
//all we need
int lengthOfBinaryNumber = binaryNumber.length();
String hexSymbolsMap = "0123456789abcdef";
int lengthOfHexSymbolsMap = hexSymbolsMap.length();
String[] binaryMap = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
// checking string
if (binaryNumber.equals("")) return "";
for (int i = 0; i < lengthOfBinaryNumber; i++) {
// checking for the binaryNumber consist of 0 and 1
if (binaryNumber.charAt(i) != '1' && binaryNumber.charAt(i) != '0') {
return "";
}
}
//making binaryNumber % 4 = 0
StringBuilder binaryNumberBuilder = new StringBuilder(binaryNumber);
while (binaryNumberBuilder.length() % 4 != 0) binaryNumberBuilder.insert(0, '0');
binaryNumber = binaryNumberBuilder.toString();
StringBuilder hexNumber = new StringBuilder();
for (int i = 0; i < lengthOfBinaryNumber; i += 4) {
//taking four symbols from binaryNumber
StringBuilder fourBinarySymbols = new StringBuilder();
for (int j = 0; j < 4; j++) {
fourBinarySymbols.append(binaryNumber.charAt(j + i));
}
//finding equals from binaryMap
for (int j = 0; j < lengthOfHexSymbolsMap; j++) {
if (fourBinarySymbols.toString().equals(binaryMap[j])) {
//adding one symbol that equals
hexNumber.append(hexSymbolsMap.charAt(j));
}
}
}
return hexNumber.toString();
}
public static String toBinary(String hexNumber) {
// all we need
if (hexNumber.equals("")) return "";
String hexSymbolsMap = "0123456789abcdef";
int lengthOfHex = hexNumber.length();
int lengthOfHexSymbolsMap = hexSymbolsMap.length();
StringBuilder binaryNumber = new StringBuilder();
String[] binaryMap = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
//checking hexNumber consist of symbols from hexSymbolsMap
for (int i = 0; i < lengthOfHex; i++) {
//isRight is a "checker"
boolean isRight = false;
//if in the end of the cycle isRight stay false then hexNumber consist of symbols that are not from hexSymbolsMap
for (int j = 0; j < lengthOfHexSymbolsMap; j++) {
if (hexNumber.charAt(i) == hexSymbolsMap.charAt(j)) {
isRight = true;
break;
}
}
// if isRight staying false, so that means hexNumber doesn't consist of symbols from hexSymbolsMap
if (!isRight) return "";
}
// after all the checks. Making binaryNumber by matching hexSymbolsMap and binaryMap using same indexes
for (int i = 0; i < lengthOfHex; i++) {
for (int j = 0; j < lengthOfHexSymbolsMap; j++) {
if (hexNumber.charAt(i) == hexSymbolsMap.charAt(j)) {
binaryNumber.append(binaryMap[j]);
}
}
}
return binaryNumber.toString();
}
}