В этом уроке по Java мы изучим разницу между десятичными и шестнадцатеричными числами, а также то, как преобразовать десятичное число в шестнадцатеричное и обратно, используя встроенные API Java и пользовательские методы.
1. Разница между десятичными и шестнадцатеричными числами
1.1.Разница
Для представления числа в десятичной системе используется 10 символов(т. е. основание 10) в диапазоне [0-9], тогда как в шестнадцатеричной системе используется 16 символов(т. е. основание 16) в диапазоне [0-9, AF].
Основание десятичного числа равно 10, то есть все цифры десятичного числа представлены в виде степени 10. А основание шестнадцатеричного числа равно 16, то есть все цифры шестнадцатеричного числа представлены в виде степени 16.

1.2 Математическое преобразование
Поскольку шестнадцатеричные числа представлены в виде степени 16, мы можем разделить данное десятичное число на 16 и рассмотреть остаток, чтобы получить соответствующее шестнадцатеричное число. Давайте разберем это на примере.
Давайте шаг за шагом разберем, как преобразовать 269(десятичное число) в шестнадцатеричное.
- Возьмем 269 как делимое и 16 как делитель.
- Разделите делимое на делитель и сохраните остаток.
- Разделите полученное на предыдущем шаге частное на 16 и сохраните остаток.
- Повторяйте третий шаг до тех пор, пока делимое не станет равным нулю.
- Конечное шестнадцатеричное число будет обратным сохраненному остатку.

2. Представление чисел с различными основаниями в Java
В Java все типы данных Number(int, long, float, double) всегда представляют значения в десятичном формате. Никогда не бывает так, чтобы int/float мог содержать любое число в двоичном, восьмеричном или шестнадцатеричном формате.
Мы можем присваивать двоичные, восьмеричные или шестнадцатеричные значения типам int/long, используя предопределенные префиксы.
int hexNum = 0X10D; // '0X' or '0x' prefix to represent hexadecimal numberint octNumber = 01560; // '0' prefix to represent octal number
Тем не менее, в конце концов, оно будет преобразовано в десятичное число, и при печати этой переменной значение будет выведено только в десятичной форме.
System.out.println(hexNum); // 269System.out.println(octNumber); // 880
Следовательно, мы никогда не сможем получить шестнадцатеричное, восьмеричное или двоичное представление любого числа в типах данных int или других десятичных типах, поэтому нам нужно представлять шестнадцатеричные/восьмеричные/двоичные числа только в строковом формате.
3. Преобразование десятичного числа в шестнадцатеричное
Давайте рассмотрим несколько простых и легких способов преобразования заданной десятичной дроби в шестнадцатеричную.
3.1 Использование числовых классов
Все классы чисел Java предоставляют встроенные методы для выполнения преобразования из десятичного в эквивалентное шестнадцатеричное число. Перечислим эти методы:
Для классов Integer и Long:
- Integer.toString(число, основание системы счисления);
- Integer.toHexString(число);
- Long.toString(число, основание системы счисления);
- Long.toHexString(число);
- BigInteger.toString(Радикс);
Для классов Float и Double:
- Float.toHexString(число);
- Double.toHexString(число);
В методах toString() мы передаем основание системы счисления(16 для шестнадцатеричной) вместе с числом для преобразования.
int number = 269;String hex = Integer.toString(number, 16); // '10d'
Метод toHexString() напрямую преобразует заданное число в шестнадцатеричную форму.
double number = 333.44d;String hex = Double.toHexString(number); // '0x1.4d70a3d70a3d7p8'
Класс BigInteger также предоставляет метод toString(radix) для той же цели.
BigInteger number = new BigInteger("269");String hex = number.toString(16); // '10d'
3.2 Использование String.format()
Класс String имеет перегруженный метод format(), который принимает спецификатор формата. Формат для представления шестнадцатеричных чисел — %x . Этот метод можно использовать для преобразования десятичного целого числа в шестнадцатеричную строку.
int number = 269;String hex = String.format("%x", number); // '10d'
3.3 Использование пользовательского метода
Мы также можем создать собственный метод и код для алгоритма, обсуждаемого в первом разделе этой статьи.
- Выполните длинное деление десятичного числа.
- Возьмите остаток деления.
- Получите шестнадцатеричный токен в соответствии с остатком.
- Добавьте токен в начало результата.
- Повторяйте эти шаги до тех пор, пока результат деления не станет равен 0.
public static String convertToHex(int number) {if(number <= 0) {return "0";}int remainder;StringBuilder result = new StringBuilder();String tokens = "0123456789ABCDEF";while(number > 0) {remainder = number % 16;result.insert(0, tokens.charAt(remainder));number = number / 16;}return result.toString();}
Теперь мы можем использовать этот метод для преобразования десятичных чисел в шестнадцатеричные в Java.
String hex = convertToHex(269);System.out.println(hex); // '10D'
4. Преобразование шестнадцатеричного числа в десятичное
4.1 Использование числовых классов
Преобразование из шестнадцатеричных строк в типы Java Number легко, если преобразовать в типы Integer и Long. Для такого преобразования есть прямая поддержка API:
- Integer.parseInt(шестнадцатеричное, основание системы счисления);
- Integer.valueOf(шестнадцатеричное, основание системы счисления);
- Целое число.decode(шестнадцатеричное);
- Long.parseLong(шестнадцатеричная система счисления, основание системы счисления);
- Long.valueOf(шестнадцатеричное, основание системы счисления);
- Длинное.декодирование(шестнадцатеричное);
- новый BigInteger(шестнадцатеричный, основание системы счисления);
Следующий пример преобразует шестнадцатеричный тип в Integer с использованием определенных методов. То же самое можно сделать для преобразования шестнадцатеричного типа в Long.
String hex = "10D";int decimal = Integer.parseInt(hex,16);//orint decimal = Integer.valueOf(hex,16);//orint decimal = Integer.decode("Ox" + hex);
Класс BigInteger также предоставляет конструктор new BigInteger(hex, radix) для той же цели.
BigInteger decimal = new BigInteger("10d",16);System.out.println(decimal); // 269
Преобразование шестнадцатеричного числа в число с плавающей точкой(float и double) не является простым. Нам необходимо выполнить следующие шаги:
- Преобразовать шестнадцатеричную строку в целое число
- Используйте Float.intBitsToFloat() или Double.longBitsToDouble() для интерпретации целого числа как значения с плавающей точкой или двойной точностью.
String myString = "BF800000";Long i = Long.parseLong(myString, 16);Float f = Float.intBitsToFloat(i.intValue());//converted float valueSystem.out.println(f);//Convert the float back to hex and verifySystem.out.println(Integer.toHexString(Float.floatToIntBits(f)));
Вывод программы:
-1.0bf800000
4.2 Использование пользовательского метода
Чтобы преобразовать шестнадцатеричную строку в десятичное целое число с помощью необработанного метода, мы воспользуемся приведенным ниже простым алгоритмом.
- Найдите десятичное число соответствующего шестнадцатеричного токена
- Сначала умножим переменную, в которую мы собираемся добавить этот десятичный токен, на 16, а затем прибавим десятичное число.
- Повторяйте эти шаги до последнего токена шестнадцатеричной строки.
public static int convertHexToDecimal(String hex) {String tokens = "0123456789ABCDEF";hex = hex.toUpperCase();int result = 0;for(int i = 0; i < hex.length(); i++) {int n = tokens.indexOf(hex.charAt(i));result = result * 16 + n;}return result;}
Давайте проверим этот метод.
System.out.println(convertHexToDecimal("10D")); //269
5. Заключение
В этом руководстве по типам данных Java мы узнали о разнице между десятичными и шестнадцатеричными числами, а также о преобразовании десятичных чисел в шестнадцатеричные с помощью API и пользовательских методов.