Решаю путем двойного перегона через десятичное. Первое условие соблюдено, а на второе ругается, и я не могу понять, почему.
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Pattern;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
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) {
String Hex = "";
String hexValue = "0123456789abcdef";
if (binaryNumber == null || binaryNumber.equals(""))
return Hex;
else if ( !(binaryNumber.matches("[01]*")))
return Hex;
else {
for (; binaryNumber.length() % 4 != 0;)
binaryNumber = "0" + binaryNumber;
int decimal = 0;
for (int i = 0; i < binaryNumber.length(); i++) {
int index = binaryNumber.length() - 1 - i;
decimal += Character.getNumericValue(binaryNumber.charAt(index)) * Math.pow(2, i);
}
while (decimal != 0) {
Hex = hexValue.charAt(decimal % 16) + Hex;
decimal /= 16;
}
return Hex;
}
}
public static String toBinary(String hexNumber) {
String binary = "";
String hexValue = "0123456789abcdef";
if (hexNumber == null || hexNumber.equals(""))
return binary;
else if (!(hexNumber.matches("[0-9a-f]*")))
return binary;
else {
int decimal = 0;
for (int i = 0; i < hexNumber.length(); i++)
decimal = decimal * 16 + hexValue.indexOf(hexNumber.charAt(i));
while (decimal != 0) {
binary = decimal % 2 + binary;
decimal /= 2;
}
return binary;
}
}
}