Перейти к содержанию

Шестнадцатеричная система счисления

Двоичная запись честно отражает биты, но длинна: адрес 0x40021000 — это 32 нуля и единицы. Шестнадцатеричная система сжимает её вчетверо, не теряя связи с битами: каждая цифра — ровно четыре бита.

Обновлено Редакция GAW

Шестнадцатеричная система счисления (hexadecimal, hex) — позиционная система с основанием 16. Цифры — 0–9 и латинские буквы A–F, обозначающие значения 10–15; вес каждого разряда в 16 раз больше соседнего справа. По Kuphaldt, восьмеричная и шестнадцатеричная системы существуют ради одного: сокращённой записи двоичных чисел — основания 8 и 16 являются степенями двойки, поэтому перевод делается группами бит без вычислений.

Одна цифра — четыре бита

HexДвоичнаяДесятичнаяHexДвоичнаяДесятичная
000000810008
100011910019
200102A101010
300113B101111
401004C110012
501015D110113
601106E111014
701117F111115

Перевод из двоичной: разбить биты на четвёрки от младшего разряда и заменить каждую цифрой. Пример Kuphaldt: 10110111₂ = 1011 0111 = B7₁₆ = 183. Обратно — каждую цифру расписать четырьмя битами. В десятичную — сумма цифр, умноженных на степени 16: B7 = 11 · 16 + 7 = 183.

Почему это удобно в электронике

  • Байт — две цифры. 0x00–0xFF, 16-битное слово — четыре цифры, 32-битный адрес — восемь. Дампы памяти и файлов прошивки выводят именно так — см. просмотрщик hex-дампа.
  • Биты видны сразу. Маска 0x0F — младшая тетрада, 0x80 — старший бит байта, 0x20 — бит 5. Маски удобно проверять в калькуляторе битовых масок.
  • Адреса регистров. Карты памяти и описания регистров в даташитах даются в hex, часто с суффиксом h: 00h, 0Fh.

Не надо путать hex с двоично-десятичным кодом: 0x59 как BCD означает 59, а как обычное число — 89. И помнить о порядке байтов: многобайтное значение 0x12345678 в памяти little-endian лежит как 78 56 34 12.

Перевести число между системами можно в конвертере систем счисления, а набить руку — в тренажёре по системам счисления.

Частые вопросы

Как перевести двоичное число в hex группами по четыре бита?

Разбить биты на группы по четыре от младшего разряда, дополнив старшую группу нулями, и заменить каждую группу цифрой 0–F. 1011 0111 — это B7. Kuphaldt показывает тот же приём для дробной части: группы отсчитывают от двоичной точки в обе стороны, и 10110111,1₂ = B7,8₁₆.

Что означают 0x и h в записи числа?

Это способы показать, что число шестнадцатеричное. В C и большинстве современных языков пишут префикс 0x — 0x1F. В даташитах часто ставят суффикс h: адреса регистров записывают как 00h, 0Fh. Математическая запись — индекс 16: 1F₁₆.

Почему в электронике используют hex, а не восьмеричную систему?

Потому что байт — восемь бит, а это ровно две шестнадцатеричные цифры. Восьмеричная цифра кодирует три бита, и байт в неё не укладывается ровно. Kuphaldt описывает обе системы как сокращённую запись двоичных чисел, но для байтовой памяти удобнее шестнадцатеричная.

Источники

  1. Kuphaldt T. R. Lessons In Electric Circuits, Vol. IV — Digital, ch. 1 «Numeration Systems», разд. «Octal and hexadecimal numeration» и «Octal and hexadecimal to decimal conversion» (CC BY) — основание системы — число цифр и множитель веса разряда; восьмеричная — основание 8, цифры 0–7; шестнадцатеричная — основание 16, цифры 0–9 и A–F; счёт до двадцати: 16 = 10000₂ = 20₈ = 10₁₆; главное назначение — сокращённая запись двоичных чисел, потому что 8 и 16 — степени двойки; перевод группами по 3 и по 4 бита от двоичной точки с дополнением нулями: 10110111,1₂ = 267,4₈ = B7,8₁₆
  2. Kuphaldt T. R. Lessons In Electric Circuits, Vol. IV — Digital, ch. 8 «Karnaugh Mapping», разд. «Don't care cells in the Karnaugh map» (CC BY) — четырёхбитные коды шестнадцатеричных цифр Ah–Fh (1010–1111) не являются допустимыми кодами BCD — пример того, как hex и BCD используют одни и те же тетрады по-разному

Нашли ошибку?