Что такое шестнадцатеричная система?

13

Что такое шестнадцатеричная система и почему она так часто используется в вычислениях? Я знаю, что компьютеры используют 0 и 1 для хранения данных, так почему же мы используем шестнадцатеричное?

Джастин Крейча
источник
13
Если не вне темы, то почему такой основной вопрос не является дубликатом через 5 лет после запуска Super User?
Питер Мортенсен
3
@PeterMortensen Даже страннее, об этом даже не спрашивали ни на одном из родственных сайтов, по крайней мере, я не могу найти.
Nzall
9
Может быть, это не нужно спрашивать, поскольку Википедия имеет довольно хороший ответ: en.wikipedia.org/wiki/Hexadecimal
Пирс Майерс
4
Почему так много голосов?
Ви.

Ответы:

31

Шестнадцатеричная система счисления очень распространена в вычислительной технике. Возможно, вы уже слышали о двоичном файле, который имеет только 1 и 0.

Люди в основном используют десятичную (основание 10) систему, в которой у нас есть 10 цифр:

0, 1, 2, 3, 4, 5, 6, 7, 8 и 9

Хотя компьютеры не работают с использованием десятичной системы. Они имеют двоичное состояние (что-то или истина или ложь) и поэтому работают в базе 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. То же самое происходит и в шестнадцатеричном формате:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11 и т. Д.

Пока мы не доберемся до 0x1F, а затем процесс повторяется до 0xFF (255 в десятичном виде), а затем мы получаем 0x100. Более подробную информацию о подсчете можно найти здесь .

Вот диаграмма, показывающая преобразования между десятичным, шестнадцатеричным, восьмеричным и двоичным: Шестнадцатеричная таблица перевода

Джастин Крейча
источник
21
Основное преимущество заключается в том, что, поскольку 16 является степенью 2, вы можете выполнять преобразование цифр за цифрой.
TRiG
2
Обратите внимание, что многие языки используют 0префикс, а не 0oдля восьмеричных чисел.
14:30
2
Ваше примечание о том, что 16 кратно 2, неправильно скопировано из комментария TRiG. Быть множественным не имеет отношения к делу.
Райан Райх
2
@ justcool393, возможно, стоит упомянуть, что название для того, что вы называете «основание 10», на самом деле является «десятичным». Это может помочь прояснить связь между основанием 8 (восьмеричное), основанием 10 (десятичное) и основанием 16 (шестнадцатеричное).
HalosGhost
3
Arrrg. Каждая база - это база 10! stale.soup.io/post/114652207/every-base-is-base-10
woliveirajr
4

Что такое шестнадцатеричная система

Шестнадцатеричная система - это система нумерации base-16, которая использует 16 цифр ( 0123456789ABCDEF), а не двоичную, которая использует 2 ( 01), или десятичную, которая использует 10 (0-9). Поскольку в нашей системе всего 10 цифровых цифр, вместо них используются буквы от A до F для описания «цифры № 10», «цифры № 11» и т. Д.

почему он так много используется в вычислительной технике

16 - это степень 2, которая упрощает преобразование шестнадцатеричных чисел в двоичные числа, и, как вы заметили, «компьютеры используют 0 и 1 для хранения данных». Поскольку каждая цифра содержит ровно 4 бита данных, шестнадцатеричная цифра может быть легко преобразована в 4 двоичных цифры (1 бит), и наоборот.

| hex bin  | hex bin  |
| 0   0000 | 8   1000 |
| 1   0001 | 9   1001 |
| 2   0010 | A   1010 |
| 3   0011 | B   1011 |
| 4   0100 | C   1100 |
| 5   0101 | D   1101 |
| 6   0110 | E   1110 |
| 7   0111 | F   1111 |

почему мы используем шестнадцатеричное

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

dec  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ...

Четыре шестнадцатеричные цифры могут представлять 65536 значений и т. Д. Шестнадцатеричный код значительно упрощает проверку данных с помощью чего-то, называемого hexdump , поскольку буквы, цифры и знаки пунктуации хранятся в формате, который отображает каждый символ в число от 0 до 256 (называемое ASCII или иногда с использованием других кодировок). Кроме того, многие другие форматы файлов (например, PNG) адаптированы таким образом, чтобы каждая часть информации, из которой состоит файл, содержала 256 битов.

Итак, 16 - это степень 2, а 256 - это степень 16. Это делает его отличным способом представления как двоичных чисел, так и текстовых или других данных.

Дверная ручка
источник
2

Что такое шестнадцатеричная система?

Если у вас есть число abcd, то это эквивалентно ((a * + b) + c) + d. Так что это как:

  • abcd (двоичный) = ((a * 2 + b) * 2 + c) * 2 + d
  • abcd (восьмеричное) = ((a * 8 + b) * 8 + c) * 8 + d
  • abcd (десятичный) = ((a * 10 + b) * 10 + c) * 10 + d
  • abcd (шестнадцатеричный) = ((a * 16 + b) * 16 + c) * 16 + 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-битное число:

  • двоичный файл: 0..11111111111111111111111111111111
  • восьмеричное: 0..37777777777
  • десятичное число: 4294967295
  • шестнадцатеричный: 0..ffffffff

Как видите, шестнадцатеричный вывод самый короткий.

Видя биты

Обычный шаблон для хранения упакованной информации - это использование каждого бита в байте индивидуально. Давайте возьмем для примера атрибуты файла (см. 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.

Вернер Хенце
источник
1

В настоящее время используются различные системы представления чисел (= 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 или выше работает так же, как и все остальное, если у вас есть хорошее однозначное представление.

Числа в десятичном виде образуются из:

... d * 10³ + c * 10² + b * 10¹ + a * 10⁰

для десятичного числа "dcba" - с d, c, b, a, выбранным из 0123456789

Теперь измените это на:

... d * base³ + c * base² + b * base¹ + a * base⁰

и у вас есть более общая форма, которая показывает, как работает любая база 2 или выше;
например, пятизначное, основание 5 может быть таким же удобным, как и любое другое из вышеперечисленных, или почему бы не 12-значная (одна дюжина) система времени (12 часов = «10» основание 12) с первым «десятичным», сообщающим, какой 1/12 [5 минут] часа)

Примечание: ⁰¹²³ - верхний индекс 0123, если на экране отображается что-то еще

Ханну
источник
В настоящее время это может быть «заглушкой» того, чем он на самом деле может стать.
Ханну