Существуют ли какие-либо реальные применения для преобразования чисел между различными базами? - PullRequest
3 голосов
/ 15 апреля 2011

Я знаю, что нам нужно преобразовать десятичные, восьмеричные и шестнадцатеричные числа в двоичные, но меня смущает преобразование десятичного числа в восьмеричное или восьмеричное в шестнадцатеричное или десятичное в шестнадцатеричное. Зачем и где нам нужны эти типы конверсии?

Ответы [ 6 ]

5 голосов
/ 15 апреля 2011

Разные базы хороши для разных целей.

  • Десятичная дробь - это, очевидно, то, с чем большинство людей знает, как справиться, поэтому она хороша для вывода реальных количеств конечным пользователям.
  • Шестнадцатеричный код является коротким и имеет четное соотношение ровно 2 символов на байт, поэтому он удобен для выражения больших чисел, таких как хэши SHA1 или закрытые ключи и т. П., В формате с возможностью ввода типов, особенно потому, что эти числа на самом деле не представляют количество, поэтому пользователям не нужно понимать их как числа.
  • Восьмеричное значение в основном по унаследованным причинам - коды доступа к файлам UNIX традиционно выражаются в виде восьмеричных чисел, например, потому что три бита на цифру хорошо соответствуют трем битам на пользовательскую категорию схемы кодирования прав UNIX.

Иногда хочется использовать числа в одной базе для целей, для которых нужна другая база. Таким образом, доступны различные функции преобразования. На самом деле, однако, мой опыт показывает, что на практике вы почти никогда не конвертируете много из одной базы в другую, за исключением преобразования чисел из некоторой недвоичной базы в двоичную (в форме собственного целочисленного типа вашего языка выбора) и возврата в любую базу вам нужно вывести. Большую часть времени вы переходите от одной недвоичной базы к другой, когда узнаете о базах и почувствуете, как выглядят числа в разных базах, или при отладке с использованием шестнадцатеричного вывода. Даже тогда, если компьютер делает это, основной метод состоит в том, чтобы преобразовать в двоичную систему и затем вернуться обратно, потому что современные компьютеры по своей природе просто хороши в работе с числами base-2 и не так хороши во всем остальном.

Одно важное место, где вы видите числа, которые на самом деле хранятся и обрабатываются в десятичном виде, - это в некоторых финансовых приложениях или других, где важно сохранить точность уровня «число-десятичное-место». Иногда арифметика с фиксированной запятой может работать для валюты, но не всегда, и если она не использует двоичную с плавающей запятой, это плохая идея. Более старые системы фактически поддерживали это в форме двоично-десятичной арифметики. В BCD каждые 4 бита действуют как десятичная цифра, поэтому вы отказываетесь от части каждых 4 бит хранения в обмен на поддержание вашего уровня точности в базовом выборе некомпьютерного мира.

Как ни странно, есть один общий вариант использования для других баз, который немного скрыт. Современные языки с поддержкой большого числа (например, тип long Python 2.x или тип BigInteger и BigDecimal Java) обычно хранят числа внутри массива, причем каждый элемент является цифрой в некоторой базе. Затем они реализуют математику, которую поддерживают на строках цифр этой базы. Действительно эффективные реализации bigint могут фактически использовать основание, приближающееся к 2 ^ (биты в машинном собственном размере слова); очевидно, что базовое число 2 ^ 64 невозможно эффективно вывести в этой форме, но выполнение вычислений кусками такого размера приводит к тому, что наилучшим образом используется пространство и процессор. (Я не знаю, является ли это лучшей базой; может быть, лучше использовать основание, равное половине этого числа битов, чтобы упростить обработку переполнения от одной цифры к другой. Прошло некоторое время с тех пор, как я написал свой собственный bigint, и я никогда не реализовывал более быстрые / более сложные версии умножения и деления.)

3 голосов
/ 15 апреля 2011

MIME использует шестнадцатеричную систему для кодировки Quoted Printable (например, тема письма в Unicode) и систему на основе abd 64 для кодировки Base64.

2 голосов
/ 15 апреля 2011

Если ваше рабочее место застряло в CIDR IPv4 - вы будете делать довольно много бинарных -> шестнадцатеричных -> десятичных преобразований, управляющих большей частью сетевого оборудования, пока вы не запомните их (или не воспользуетесь каким-то простым, простым инструментом).

Даже это использование немного и далеко-далеко - большинство предприятий просто применяют ленивый подход "/ 24 все".

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

Я полагаю, что нет практической причины для этогоспособен делать что-то кроме того, что действительно просто, и нет смысла не учиться делать это.:)

... если, по какой-то причине, вы не пытаетесь сделать бинарную математику в своей голове.

1 голос
/ 15 апреля 2011

Реальный пример использования: программа печатает код ошибки в десятичном формате, для получения информации из базы данных или Интернета вам необходим шестнадцатеричный формат, потому что биты ошибки «число» передают дополнительную информацию, которую вам нужно посмотретьв двоичном формате.

1 голос
/ 15 апреля 2011

Все эти базы имеют свое применение. Шестнадцатеричный в частности полезен как сокращение для двоичного файла. Каждая шестнадцатеричная цифра эквивалентна 4 битам, поэтому вы можете записать полное 32-битное значение в виде строки из 8 шестнадцатеричных цифр. Аналогично, восьмеричные цифры эквивалентны 3 битам и часто используются как сокращение для таких вещей, как права доступа к файлу Unix (777 = установить биты чтения, записи, выполнения для пользователя / группы / других).

Ни одна база не является особенной - все они имеют свое (неясное) применение. Десятичная дробь является особенной для нас, потому что она отражает человеческий опыт (10 пальцев), но это действительно единственная причина.

0 голосов
/ 15 апреля 2011

Я иногда пользуюсь этим. Одним из вариантов использования было бы небольшое приложение, которое позволяет пользователям, которые хотят преобразовать десятичные числа в восьмеричные ... как вы можете с помощью большого количества калькуляторов.

Но я не уверен, что понимаю суть вопроса. Стандартные библиотеки обычно не предоставляют такие методы, как String toOctal(String decimal). Вместо этого вы обычно конвертируете из десятичной строки в примитивное целое число, а затем из простого числа в (скажем) восьмеричную строку.

...