Java – Преобразование десятичных чисел в шестнадцатеричные и наоборот

В этом уроке по Java мы изучим разницу между десятичными и шестнадцатеричными числами, а также то, как преобразовать десятичное число в шестнадцатеричное и обратно, используя встроенные API Java и пользовательские методы.

1. Разница между десятичными и шестнадцатеричными числами

1.1.Разница

Для представления числа в десятичной системе используется 10 символов(т. е. основание 10) в диапазоне [0-9], тогда как в шестнадцатеричной системе используется 16 символов(т. е. основание 16) в диапазоне [0-9, AF].

Основание десятичного числа равно 10, то есть все цифры десятичного числа представлены в виде степени 10. А основание шестнадцатеричного числа равно 16, то есть все цифры шестнадцатеричного числа представлены в виде степени 16.

Java – Преобразование десятичных чисел в шестнадцатеричные и наоборот0

1.2 Математическое преобразование

Поскольку шестнадцатеричные числа представлены в виде степени 16, мы можем разделить данное десятичное число на 16 и рассмотреть остаток, чтобы получить соответствующее шестнадцатеричное число. Давайте разберем это на примере.

Давайте шаг за шагом разберем, как преобразовать 269(десятичное число) в шестнадцатеричное.

  1. Возьмем 269 как делимое и 16 как делитель.
  2. Разделите делимое на делитель и сохраните остаток.
  3. Разделите полученное на предыдущем шаге частное на 16 и сохраните остаток.
  4. Повторяйте третий шаг до тех пор, пока делимое не станет равным нулю.
  5. Конечное шестнадцатеричное число будет обратным сохраненному остатку.
Java – Преобразование десятичных чисел в шестнадцатеричные и наоборот1

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 и пользовательских методов.

Исходный код на Github

Прокрутить вверх