Что такое шестнадцатеричная система и почему она так часто используется в вычислениях? Я знаю, что компьютеры используют 0 и 1 для хранения данных, так почему же мы используем шестнадцатеричное?
terminology
hexadecimal
Джастин Крейча
источник
источник
Ответы:
Шестнадцатеричная система счисления очень распространена в вычислительной технике. Возможно, вы уже слышали о двоичном файле, который имеет только 1 и 0.
Люди в основном используют десятичную (основание 10) систему, в которой у нас есть 10 цифр:
Хотя компьютеры не работают с использованием десятичной системы. Они имеют двоичное состояние (что-то или истина или ложь) и поэтому работают в базе 2 (двоичные числа обычно имеют префикс 0b) с единственными цифрами, равными 0 и 1.
В прежние дни восьмеричное (или основание 8) использовалось. Это было хорошо, потому что «10» в базе 8 было «0b1000» в двоичном (10 в десятичной системе - 1010 в двоичной). Octal обычно имеет префикс «0o» при написании чисел (но в большинстве языков программирования префикс «0»). Он называется основанием 8, потому что у нас восемь цифр.
Octal все еще используется сегодня, в основном при настройке разрешений в Unix и Linux
Со временем нам понадобился более простой способ представления больших чисел, поскольку вычислительная мощность и пространство быстро росли. Стало стандартом использовать шестнадцатеричное или основание 16, потому что 16, как 8, является степенью 2, что упрощает преобразование цифр в цифры (см. Этот комментарий. Поскольку имеется 16 цифр, буквы использовались для другие цифры. Кроме того, к гексу обычно добавляется 0x.
Шестнадцатеричные числа также полезны, так как шестнадцатеричное число составляет 4 бита (1 восьмеричное число может представлять 2), и, следовательно, два числа в байте. В большинстве шестнадцатеричных редакторов именно так представлен байт.
Counting
В базе 10 у нас есть 10 цифр. После 9, что мы делаем? У нас нет цифр. Мы создаем «десятки» слева от исходного числа, которое должно быть 1, а крайнее правое становится 0. То же самое происходит и в шестнадцатеричном формате:
Пока мы не доберемся до 0x1F, а затем процесс повторяется до 0xFF (255 в десятичном виде), а затем мы получаем 0x100. Более подробную информацию о подсчете можно найти здесь .
Вот диаграмма, показывающая преобразования между десятичным, шестнадцатеричным, восьмеричным и двоичным:
источник
0
префикс, а не0o
для восьмеричных чисел.Шестнадцатеричная система - это система нумерации base-16, которая использует 16 цифр (
0123456789ABCDEF
), а не двоичную, которая использует 2 (01
), или десятичную, которая использует 10 (0-9). Поскольку в нашей системе всего 10 цифровых цифр, вместо них используются буквы от A до F для описания «цифры № 10», «цифры № 11» и т. Д.16 - это степень 2, которая упрощает преобразование шестнадцатеричных чисел в двоичные числа, и, как вы заметили, «компьютеры используют 0 и 1 для хранения данных». Поскольку каждая цифра содержит ровно 4 бита данных, шестнадцатеричная цифра может быть легко преобразована в 4 двоичных цифры (1 бит), и наоборот.
Это упрощает двоичное представление больших чисел. Всего две шестнадцатеричные цифры могут представлять 256 различных значений, как в:
Четыре шестнадцатеричные цифры могут представлять 65536 значений и т. Д. Шестнадцатеричный код значительно упрощает проверку данных с помощью чего-то, называемого hexdump , поскольку буквы, цифры и знаки пунктуации хранятся в формате, который отображает каждый символ в число от 0 до 256 (называемое ASCII или иногда с использованием других кодировок). Кроме того, многие другие форматы файлов (например, PNG) адаптированы таким образом, чтобы каждая часть информации, из которой состоит файл, содержала 256 битов.
Итак, 16 - это степень 2, а 256 - это степень 16. Это делает его отличным способом представления как двоичных чисел, так и текстовых или других данных.
источник
Что такое шестнадцатеричная система?
Если у вас есть число abcd, то это эквивалентно ((a * + b) + c) + d. Так что это как:
В шестнадцатеричной системе вам нужно 16 цифр, но у нас есть только десять цифр (0..9). Таким образом, для пропущенных 6 цифр символы A..F используются с A = 10, ..., F = 15.
Конечно, вы также можете подумать о многих других системах счисления, например, с основанием 5 или 7.
Для расчета с числами не имеет значения, какую базу вы используете. Вы можете добавлять и умножать в двоичной системе, вы можете делать это в десятичной системе, и вы можете делать это в шестнадцатеричной системе. Мы привыкли считать в десятичной системе, компьютеры делают это в двоичной системе.
Почему шестнадцатеричная система так часто используется в вычислениях?
Как сказано выше, не имеет значения, в какой системе счисления вы даете номер. Основной номер тот же, меняется только представление. Компьютер всегда будет хранить и использовать (например, вычислять с) числа в двоичном виде.
Так почему же программисты (как и я) используют разные системы счисления? Существует две причины выбора системы счисления на основе степени 2. Первая - это краткость, а вторая - хорошее представление о том, какие биты установлены.
краткость
Если у меня есть функция, которая записывает содержимое буфера в консоль, я мог бы написать код, который печатается в десятичном формате, который составляет от 1 до 3 цифр (десятичное число: 0..255). Если я пишу число в двоичном формате, я получу от 1 до 8 цифр (двоичный: 0..11111111). Я также мог бы использовать восьмеричную систему и в итоге получить от 1 до 3 цифр (восьмеричное: 0..377) или шестнадцатеричное с 1-2 цифрами (шестнадцатеричное: 0..ff).
Это было только для одного байта. Давайте теперь предположим, что вы хотите написать 32-битное число:
Как видите, шестнадцатеричный вывод самый короткий.
Видя биты
Обычный шаблон для хранения упакованной информации - это использование каждого бита в байте индивидуально. Давайте возьмем для примера атрибуты файла (см. MDSN ). Вы хотите атрибуты «скрытый», «архив», «только для чтения», «временный» и другие. Вы можете хранить каждый атрибут в одном байте или упаковать информацию в один байт (или несколько байтов), где каждый бит представляет ровно один атрибут. Если вы посмотрите на dwFlagsAndAttributes в статье MSDN, то увидите, что Windows использует этот шаблон.
Оставаясь на странице MSDN, давайте возьмем
FILE_ATTRIBUTE_ENCRYPTED
в качестве примера, этот флаг является десятичным 16384 и шестнадцатеричным 0x4000. Ведущий «0x» - это просто соглашение программиста на C пометить шестнадцатеричные числа, поэтому мы просто посмотрим на 4000. Когда вы хотите узнать, какие биты установлены, вам сначала нужно будет преобразовать 16384 в двоичный код - ничего, что вы могли бы обычно делают с умственной арифметикой. Но давайте возьмем шестнадцатеричный 4000. Это довольно просто. 16 - это 2 * 4, поэтому каждое шестнадцатеричное число составляет ровно 4 бита. Для этого мы просто конвертируем 4 в двоичный 0100, а нули в двоичный 0000, и все готово.Часто речь идет не об отдельных битах, а программисты склонны выравнивать вещи со степенью 2. Нам нравится загружать программы не по случайному адресу, а по адресу с 16 младшими значащими битами, установленными в ноль. Таким образом, если у вас есть адрес 0x12345678, вы можете легко увидеть, что этот адрес принадлежит программе, загруженной в 0x1234, а не той, которая загружена в 0x03810000.
Предпочитаете двоичный, восьмеричный или шестнадцатеричный?
Это вопрос вкуса. Если вы хотите напрямую увидеть двоичные биты, все будет в порядке. Для длинных чисел двоичный код может расстраивать, если вам нужно посчитать цифры, чтобы увидеть, установлен ли бит 23 или 24. Это проще с шестнадцатеричным, потому что каждая цифра представляет 4 бита, так что вам нужно меньше считать. Лично я редко использую восьмеричное. Это очень необычно.
Но почему бы не использовать базу 32?
База 32 - это степень 2, это здорово. Но вам нужно 32 цифры, такие как 0..9, A..V. Это гораздо больше цифр, чтобы запомнить (вы можете легко определить, на какое число «S» будет отвечать?). Еще одно предостережение: с базой 32 вы теряете замечательную особенность, состоящую в том, что две шестнадцатеричные цифры составляют ровно один байт, что очень удобно, если вы посмотрите на содержимое памяти! Также с основанием 32 вам все еще нужны 2 цифры для представления значений, которые может иметь один байт. Для 32-битного значения вам нужно всего 7 цифр вместо 8 шестнадцатеричных цифр, но это не так уж и много, чтобы справиться с недостатками базовой системы 32.
источник
В настоящее время используются различные системы представления чисел (= include):
двоичная, восьмеричная, десятичная и шестнадцатеричная.
Какой из них выбрать, часто зависит от простоты использования для поставленной задачи.
двоичный код используется в компьютерных системах и цифровых технологиях в целом, поскольку его легко представить в электронике; Функции для чисел base-2 легко построить, как и представление on / off, true / false или любую другую аналогичную информацию о двух состояниях.
восьмеричное хорошо иметь, если есть группы из трех двоичных цифр, например, как в настройках разрешений в Unix / Linux.
пропуская десятичную дробь на мгновение, шестнадцатеричный код хорош тем же образом, что и восьмеричный, но для четырех двоичных цифр, и тот факт, что 8 битов, один байт, хорошо вписывается в две шестнадцатеричные цифры. ( = ответ )
Из этого следует, что четные 8-битные группы в компьютере легко записываются, представляются и понимаются - то есть; очень удобно в повседневном использовании при написании программного обеспечения, обработке данных (например, значений цвета rgb в HTML / CSS), формировании структур данных и всего остального подобного.
десятичное . Можно предположить, что десятичная система возникла из того, что у нас десять пальцев рук и ног. Одна цифра представляет количество подсчитанных предметов, по одному на каждый палец, максимум до десяти.
Они представляют собой системы счисления с базой:
2, 8, 10 и 16.
Как правило, база показывает, сколько однозначных «элементов» вы можете сосчитать, например, двоичное имеет два, десятичное - десять.
Поскольку шестнадцатеричное число содержит 16 однозначных элементов, системе требуется 16 «цифр», поэтому используются 0-9 и af (6 дополнительных по сравнению с десятичным), где «a» равно 10, а «f» равно 15 в десятичной системе.
Чтобы продолжить в общем режиме: любая основа 2 или выше работает так же, как и все остальное, если у вас есть хорошее однозначное представление.
Числа в десятичном виде образуются из:
для десятичного числа "dcba" - с d, c, b, a, выбранным из 0123456789
Теперь измените это на:
и у вас есть более общая форма, которая показывает, как работает любая база 2 или выше;
например, пятизначное, основание 5 может быть таким же удобным, как и любое другое из вышеперечисленных, или почему бы не 12-значная (одна дюжина) система времени (12 часов = «10» основание 12) с первым «десятичным», сообщающим, какой 1/12 [5 минут] часа)
Примечание: ⁰¹²³ - верхний индекс 0123, если на экране отображается что-то еще
источник