Что такое шестнадцатеричная система и почему она так часто используется в вычислениях? Я знаю, что компьютеры используют 0 и 1 для хранения данных, так почему же мы используем шестнадцатеричное?
3 ответа
Шестнадцатеричная система счисления очень распространена в вычислительной технике. Возможно, вы слышали о двоичном файле, который имеет только 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), и, следовательно, два числа в байте. В большинстве шестнадцатеричных редакторов именно так представлен байт.
подсчет
В базе 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. Более подробную информацию о подсчете можно найти здесь.
Вот диаграмма, показывающая преобразования между десятичным, шестнадцатеричным, восьмеричным и двоичным:
Что такое шестнадцатеричная система
Шестнадцатеричная система - это система нумерации 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. Это делает его хорошим способом представления как двоичных чисел, так и текстовых или других данных.
Что такое шестнадцатеричная система?
Если у вас есть число 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.