Почему существует ограничение по основанию Java?

#java

#java

Вопрос:

Я заметил, что максимальный предел для радиуса в Java равен base 36. Это произвольное ограничение, или у Java есть причина для ограничения радиуса таким образом?

Комментарии:

1. Какой, по-вашему, должна быть 37-я цифра в базе 37?

2. Потому что мы не хотели начинать использовать не буквы и не цифры для представления чисел 😉

3. Загрузите классический Forth, который принимает строки ASCII. Установите БАЗОВОЕ значение на 256. Все, что вводится в интерпретаторе, теперь является числом, которое помещается в стек. Уиииии!

Ответ №1:

Это количество десятичных цифр (10) плюс количество букв в алфавите (26).

Если бы был разрешен радиус 37, пришлось бы выбрать новый символ для представления 37-й цифры. Хотя, безусловно, было бы возможно выбрать некоторый символ, очевидного выбора нет. Имеет смысл просто запретить большие радиусы.

Комментарии:

1. Конечно, некоторые языки, такие как арифметика оболочки Bash, допускают более высокие радиусы (radices?) путем различения прописных букв от строчных, когда основание больше 36. Java этого не делает.

2. Точно. Итак, почему Java основала максимальный радиус на буквенно-цифровом символе без учета регистра вместо буквенно-цифрового символа с учетом регистра? Кажется глупым выбрасывать 26 цифр.

3. Как насчет заглавной буквы A?

4. Если вы делаете заглавные и строчные буквы разными, какое значение больше, A или a ? Опять же, легко выбрать одно, но это был бы произвольный выбор — нет очевидного выбора. Также традиционно шестнадцатеричный код сохраняет регистровые изменения — 0x8a == 0x8A; было бы запутанно иметь некоторые базы, в которых это не применяется. Тем не менее, вы можете достичь базы 62, используя 0-9a-zA-Z — вы просто не можете этого сделать с Integer.toString()

5. Что стоит на первом месте, 0 или a ? Произвольно! Не очевидно!

Ответ №2:

Очень просто: 26 букв 10 цифр = 36.

Для представления числа традиционно используются цифры и латинские буквы.

Ответ №3:

Для полноты картины я бы добавил, что в JDK определены две константы:

 Character.MIN_RADIX
Character.MAX_RADIX
  

Ответ №4:

Ограничение по основанию имеет смысл, если вывод должен быть читаемым. В разных случаях выходные данные не обязательно должны быть читаемыми. Таким образом, действительно, более высокий предел помог бы в таких случаях. И ограничение по основанию языка Java является слабым местом для java.

Ответ №5:

Вы можете использовать Base64 схему кодирования, указанную в RFC 4648 и RFC 2045.

Просто сгенерируйте байтовое представление вашего номера int в соответствии с вашими потребностями, чтобы быть совместимым с большинством библиотек, реализующих Base64.