СТАРТ ЗНАНИЙ! -50% на стартовые курсы программирования! 🤓
Узнать больше
26.09.2024
7 минут чтения

Как работает Integer.parseInt: конвертация чисел в разных системах счисления

В программировании часто возникает необходимость работать с числами, записанными в разных системах счисления. Система счисления — это способ представления чисел с помощью набора символов, таких как цифры и буквы, организованных по определенным правилам. Например, вы, вероятно, слышали о двоичной системе счисления, в которой используются только цифры 0 и 1. В повседневной жизни мы чаще всего используем десятичную систему, которая состоит из цифр от 0 до 9. А еще есть шестнадцатеричная система счисления, где, кроме цифр от 0 до 9, используются также буквы A-F для представления чисел. Есть и другие системы счисления, о которых мы поговорим далее. Чтобы эффективно конвертировать такие числа в привычную нам десятичную систему, в Java используется метод Integer.parseInt(String s, int radix). Этот метод предоставляет гибкий и простой способ преобразования строки, представляющей число в любой системе счисления (от 2 до 36), в целое число типа int. Академия FoxmindEd может предоставить тебе более углубленные знания в программировании на JAVA. Но в этой статье мы рассмотрим, как работает этот метод и почему он является полезным инструментом в работе с данными, использующими различные системы счисления.

🚀 Курс Java Start от Сергея Немчинского сделает ваш старт в Java понятным и быстрым! 📆 Продолжительность курса: Среднее время прохождения — 2-4 недели.
Записаться на курс

Основная часть

Метод Integer.parseInt(String s, int radix) позволяет конвертировать строку, которая представляет число в любой системе счисления (от 2 до 36), в десятичное число (типа int). Мы указываем значение, и систему счисления в которой оно записано, а метод конвертирует его в десятичное значение. Система счисления — это способ записи чисел с использованием цифр и букв по определенным правилам. Думаю, многие знают о двоичной системе (цифры 0 и 1) или о десятичной (цифры от 0 до 9), которой мы пользуемся в повседневной жизни.

То есть мы можем конвертировать «00110» из двоичной системы счисления в понятное для нас значение, указав radix 2. Или можем преобразовать строку с числовым значением «145» в int, использовав radix 10 (десятичная система счисления).

Метод принимает два аргумента: строку и основание системы счисления (от 2 до 36). Символы для каждой системы счисления включают цифры от 0 до 9 и буквы от A до Z, где A представляет 10, B представляет 11 и так далее до Z, которая представляет 35.

Понять, какие символы доступны в системе счисления, довольно просто. Число, описывающее систему счисления, указывает на количество символов в ней. Система счисления с основанием 8 имеет 8 символов, в двоичной — два и так далее. Отправной точкой являются цифры от 0 до 9, а дальше, если нужно больше символов, добавляются буквы. Восьмеричная система содержит цифры от 0 до 7 (всего 8 символов). В системе счисления с основанием 16 — шестнадцать символов: от 0 до 9 и буквы от A до F (всего 16 символов).

  • Возможные значения для систем счисления:

Цифры: 0 1 2 3 4 5 6 7 8 9

Буквы: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

  • Числовое представление букв:

A(11), B(12), C(13)… X(34), Y(35), Z(36)

  • Примеры систем счисления и их значение:

16-ва: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

12-ва: 0,1,2,3,4,5,6,7,8,9,A,B

Если символ не входит в допустимый диапазон для данной системы, возникает ошибка (NumberFormatException). Передав «radix» 12 и строку «3K5» мы получим ошибку, ведь последняя буква, которая присутствует в системе 12 это B, а мы передали K. Или при передаче в систему счисления 2 строки «05» или любой строки с буквами, ведь 5-ки или букв нет в системе счисления 2. Там представлены только 0 и 1. Так же ошибка будет, если передать radix больше 36, или меньше 2.

public class Main {

   public static void main(String[] args) {

       String str = "3B5";

       try {

           int number = Integer.parseInt(str, 12);

           System.out.println(number); // -> 569

       } catch (NumberFormatException e) {

           System.out.println(e.getMessage());

       }

   }

}

Как работает вычисление:

  1. Прежде всего необходимо разложить строку на цифры и буквы:
    • Сначала мы разбиваем строку на отдельные цифры и буквы. Например, для строки «3B5» — это будет 3, B и 5.
  2. Определить позиции каждой цифры и буквы:
    • Каждая цифра и буква в числе имеет свою позицию. Позиция определяется от нуля справа налево, начиная с последней цифры/буквы. Например, в строке «3B5»:
      • Цифра 5 находится на позиции 0.
      • Цифра B находится на позиции 1.
      • Цифра 3 находится на позиции 2.
  3. Вычислить вес каждой цифры и буквы:
    • Каждая цифра или буква умножается на систему счисления в степени, соответствующей ее позиции. Например, мы передадим radix 12:
      • 5 умножается на 12⁰.
      • B умножается на 12¹ (B имеет значение 11)
      • 3 умножается на 12².
  4. Составить все результаты:
    • Затем мы складываем все эти результаты вместе, чтобы получить результат:

Подсчет: 3*122+ 11*121+ 5*120= 569

Еще немного примеров:

public class Main {

   public static void main(String[] args) {

       String str = "17";

       try {

           int number = Integer.parseInt(str, 8);

           System.out.println(number); // -> 1*8¹+7*8⁰=15

       } catch (NumberFormatException e) {

           System.out.println(e.getMessage());

       }

   }

}

public class Main {

   public static void main(String[] args) {

       String str = "D"; // буква D имеет вес 13

       try {

           int number = Integer.parseInt(str, 16);

           System.out.println(number); // -> 13*16⁰ =13

       } catch (NumberFormatException e) {

           System.out.println(e.getMessage());

       }

   }

}

Поэтому чтобы нам конвертировать строку с валидным числовым значением в int, достаточно передать radix 10, ведь, напоминаю, мы пользуемся десятичной системой счисления. Как видите, число 17 в десятичной системе счисления это 17, а в восьмеричной — 15.

public class Main {

   public static void main(String[] args) {

       String str = "17";

       try {

           int number = Integer.parseInt(str, 10);

           System.out.println(number); // -> 17

       } catch (NumberFormatException e) {

           System.out.println(e.getMessage());

       }

   }

}

Заключение

Конвертация чисел между различными системами счисления является важным инструментом в программировании, особенно при работе с данными, использующими нестандартные форматы или когда нужно выполнять операции над числами в разных системах счисления. Это помогает в работе с памятью, сетевыми протоколами, настройками микроконтроллеров, в криптографии, а также в процессе отладки и анализа программного обеспечения.

FAQ
Что делает метод Integer.parseInt(String s, int radix)?

Он преобразует строку, представляющую число в различной системе счисления (от 2 до 36), в целое число типа int.

Как выбрать правильное значение radix для системы счисления?

Radix - это основание системы счисления. Для двоичной системы radix равен 2, для десятичной - 10, для шестнадцатеричной - 16.

Какие символы используются в различных системах счисления?

Системы от 2 до 9 используют цифры 0-9, а от 10 до 36 - еще и буквы A-Z (где A=10, B=11, и так далее).

Что произойдет, если передать символы, которые не соответствуют системе счисления?

Если в строке есть недопустимые символы для указанной системы счисления, возникнет ошибка NumberFormatException.

Почему radix не может быть больше 36 или меньше 2?

Метод Integer.parseInt поддерживает только системы счисления от 2 до 36, поскольку они используют только цифры и буквы латинского алфавита.

Как работает конвертация числа из строки?

Каждый символ в строке интерпретируется в соответствии с его позицией и умножается на основание системы счисления в определенной степени. Затем результаты складываются для получения конечного числа.

У вас остались вопросы о том, как работает Integer.parseInt? Спрашивайте в комментариях ниже!

Добавить комментарий

Ваш имейл не будет опубликован. Обязательные поля отмечены *

Сохранить моё имя, имейл и адрес сайта в этом браузере для будущих комментариев