Содержание этого сообщения основано на материале прошлой недели Биты, байты, создание с помощью двоичного кода . Если вы новичок в этой теме, я рекомендую сначала прочитать эту статью!

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

Вы ведь знаете, о каких числах я говорю?

Нет? А, позвольте представить вас!

На прошлой неделе мы узнали о двоичной системе счисления, основанной на простом принципе: каждая цифра может иметь только два возможных значения, 1 или 0. Поскольку компьютеры состоят из транзисторов или схем, которые в основе это просто переключатели включения / выключения, двоичная система - это отличная система счисления и язык для компьютера. Очевидно, что мы не пишем в двоичном формате; есть уровни абстракции, которые делают за нас компиляцию и преобразование.

Но одна из особенностей двоичного кода, которая имеет решающее значение для всех этих «уровней абстракции», - это единицы измерения, которые дает нам двоичный код. Восемь цифр в двоичном формате переводятся в байт, а байты могут быть объединены в килобайты, мегабайты, гигабайты, терабайты и т. Д. ).

Тем не менее, с двоичными данными есть немного неприятная проблема: вам нужно много цифр, чтобы представить только один однобайтный. Чтобы быть более конкретным, вам понадобится 8 цифр или 8 бит.

Хорошо, но подождите: 8 цифр на символ, возможно, неплохо так. Но как насчет того, чтобы изобразить слово? Сколько бит вам понадобится? Что, если бы вы хотели представить свое имя? Что, если бы мы хотели представить мое имя?

Ну, давайте попробуем:

«vaidehi» скомпилировано непосредственно в двоичный файл:
01110110 01100001 01101001 01100100 01100101 01101000 01101001

Да, да, но я хотел бы написать свое имя с заглавной буквы, пожалуйста. Как мне это представить?

"Vaidehi", скомпилированный напрямую в двоичный файл,
01010110 01100001 01101001 01100100 01100101 01101000 01101001

Не хорошо. Не то чтобы читабельно. Определенно не коротко. Мое имя равно 56 битам (цифрам), или 7 байтам, или действительно ужасная головная боль, в зависимости от того, как долго вы смотрите на все эти единицы и нули (не рекомендую!).

Я хочу сказать следующее: байт - это мощная единица, конечно, но помните: один байт может представлять только один символ. Итак, мы можем представить себе огромное количество битов, которое нам понадобится для представления изображения, гифки или видео! На самом деле, это число настолько велико, что я даже не могу представить его.

Все это заставляет нас задуматься, есть ли лучший способ представить символы и слова до того, как они будут скомпилированы компьютером в двоичную форму, верно? Должен быть способ представить эти вещи, чтобы они были более удобочитаемыми, но также могли быть преобразованы нашими машинами?

Ага. Совершенно есть лучший способ. На самом деле, есть несколько способов, и многие из них снова и снова появляются в компьютерных науках. Помните те уровни абстракции? Что ж, есть некоторые волшебные числа, которые являются краеугольным камнем того, как мы абстрагируем биты и байты информации в более удобные для чтения участки информации.

У меня 128 проблем, но с кодированием нет ни одной

Задержать.

Как я мог представить свое имя в двоичном формате ?! Мы только научились преобразовывать десятичные дроби (с основанием 10) в двоичные; как преобразовать буквы в двоичные? Что это за магия ?!

Что ж, это не волшебство - это абстракция! И в этом случае абстракция, с которой мы имеем дело, называется кодировкой . Кодирование - это стандартизированный способ перевода между двумя вещами - что-то вроде Розеттского камня для другого числа. системы вместо языков.

Мне очень нравится, как Дэвид Зентграф объясняет и определяет кодировку в своем блоге:

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

Итак, каким правилам я следовал, чтобы преобразовать буквы в двоичные? Я использовал схему кодирования, о которой вы, возможно, уже слышали: Кодировка ASCII.

Кодировка ASCII - это набор правил, который позволяет нам переводить определенные символы в десятичные числа.

Существует 95 «удобочитаемых» символов, между которыми ASCII позволяет переводить: числа 0–9, английский алфавит (буквы a-z в нижнем и верхнем регистре), несколько различных знаков препинания, математические символы и другие специальные символы. Интересно, что вы также можете переводить пробелы, табуляции, обратные пробелы, удаления и новые строки, что невероятно важно (даже если это может показаться не сразу очевидным), поскольку компьютеры должны точно знать, когда и где в тексте происходят эти действия.

Схема кодирования ASCII допускает 128 возможных «переводов», что означает, что все в ASCII при преобразовании в десятичные числа должно находиться между числами от 0 до 255. Но мы вернемся к этому чуть позже.

Надеемся, что с помощью приведенной выше таблицы ASCII стало немного понятнее, как перевести мое имя (с большой буквы). Мы можем делать два шага за раз, преобразовывая сначала в десятичную, а затем в двоичную.

Vaidehi декодируется из ASCII в десятичные числа:
86
97
105
100
101
104
105

Vaidehi преобразован из десятичных чисел в двоичные:
01010110
01100001
01101001
01100100
01100101
01101000
01101001

Вы заметили что-нибудь интересное в двоичном представлении моего имени? Даже если мы не знали как преобразовать из двоичного кода, есть две вещи, которые мы можем сделать, просто взглянув на эти числа:

  1. Каждый символ представлен в двоичном формате с 8 цифрами; другими словами, для представления каждого символа требуется 8 бит или 1 байт информации.
  2. Каждый из этих символов в двоичном формате начинается с цифры 0.

Это означает, что для каждого из этих символов действительно требуется всего 7 бит, да? Эта первая цифра, кажется, всегда остается неиспользованной в каждой букве моего имени. Мне кажется, это ужасная трата целого бита.

Оказывается, эта мысль пришла в голову не только мне.

Введите 256

Если мы еще раз посмотрим на эту таблицу ASCII, одна вещь станет довольно ясной: это действительно не так много символов, с которыми нужно работать. Где é? Или ø? А что насчет æ? Как я когда-нибудь буду представлять Smørbrøad, чтобы мой компьютер мог преобразовать его в двоичный формат?

Мы уже знаем, что ASCII (в том виде, в котором он был впервые создан) допускал только 128 возможных перестановок. В этом случае дополнительный 0 в начале каждого двоичного байта, преобразованного в ASCII, в моем имени имеет немного больше смысла: вам нужно всего 7 бит для представления 128 различных возможностей. (Помните, что степени 2 × 2 в степени 7 равны 128, 7 битов, используемых вместе в любой момент времени, всегда приводят к 128 возможностям). Таким образом, этот первый 0 может просто не использоваться.

Но что, если бы мы не оставили этот первый бит, эту первую цифру полностью неиспользованными? Что случилось бы?

Что ж, давайте посчитаем:

7 бит равно 2 в степени 7. Или 128 возможностей.
8 бит равно 2 в степени 8. Или 256 возможности.

И именно эта математика привела к расширению схемы кодирования ASCII! Вот как это выглядит:

Расширенная таблица ASCII добавила еще 128 возможностей к исходной схеме кодирования ASCII и даже оставила место для дополнительных возможностей символов в будущем! Если подумать, это довольно круто, учитывая, что мы можем упаковать в два раза больше кодировок всего с одним дополнительным битом. Биты - это мощно, друзья мои.

Прежде чем мы перейдем к запоминанию таблицы ASCII, стоит упомянуть, что вещи можно кодировать разными способами! Несомненно, ASCII - очень популярная схема кодирования, и вы, вероятно, будете часто ее видеть из-за того, что ее легко распознать по начальным нулям. Однако будьте осторожны: есть и другие способы кодирования символов! Не все кодируется с использованием ASCII, но одно можно сказать наверняка: все схемы кодирования позволяют нам упростить преобразование между символами и двоичным кодом, просто добавляя правила как слой абстракции прямо между ними.

Как я люблю 16? Позвольте мне посчитать пути.

Итак, 128 и 256 - довольно хорошие числа, и полезно знать, где они могут появиться. Но на самом деле они просто готовили почву для другого числа, вероятно, одного из самых важных в программном обеспечении, которое спрятано во всех укромных уголках сети и даже внутри вашей собственной машины.

Я говорю о числе 16. И, надеюсь, к тому времени, когда вы дойдете до конца этого поста, он вам понравится так же, как и мне.

Я наложил на тебя проклятие

Мы знаем, что кодирование - это одна из форм абстракции между определенными символами и их двоичными переводами. Но есть еще одна абстракция, которая обычно используется в информатике, и происходит она от другой системы счисления - системы счисления по основанию 16 или шестнадцатеричной системе счисления.

Подобно основанию 10 и основанию 2, система счисления с основанием 16 имеет, как вы уже догадались, 16 возможных цифр на место. Вы можете иметь 16 возможных цифр в одном месте, и цифры будут выглядеть так:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Я серьезно. Действительно! Если бы вы хотели представить 12 элементов в базе 16, вы бы сказали, что у меня есть элементы C (и, я думаю, надеюсь, что человек, с которым вы разговаривали, тоже знал шестнадцатеричные числа). Поначалу это может показаться немного странным, но как только вы к этому привыкнете, сила шестнадцатеричных чисел станет очевидной.

Чтобы представить десятичное число 205 в двоичном формате (с основанием 2), нам нужно 8 цифр. Но, чтобы представить его в шестнадцатеричной системе счисления (основание 16), нам нужны только 2 цифры. Эмпирическое правило здесь заключается в том, что чем выше база, тем меньше разрядов требуется для представления числа.

Если подумать, это имеет смысл: если у нас есть только 2 возможных варианта на место (например, в двоичном формате, когда мы можем выбирать между 0 и 1), нам нужно больше цифр для представления большего числа, потому что перестановки на стоимость места очень мала. С другой стороны, если у нас есть много возможных вариантов для каждого места (например, в шестнадцатеричных числах, когда у нас есть 0-F), у нас есть больше возможных перестановок для каждого значения места, поэтому мы можем представлять большие числа без необходимости добавлять еще одну цифру.

Итак, нам нужно меньше цифр. Думаю, это круто. Но почему это важно?

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

Именно это делает шестнадцатеричные числа такими мощными. Вот почему, если мы посмотрим в нужных местах, мы сможем увидеть их повсюду, повсюду и в дикой природе Интернета.

Шестнадцатеричные числа по городу

Если вы когда-либо создавали веб-сайт, работали с дизайнером или проверяли веб-страницу, вы, вероятно, видели один или два шестнадцатеричного кода.

Шестнадцатеричный используется для указания цветов на веб-сайте и может использоваться встроенным в HTML веб-страницы или, чаще, в CSS (таблице стилей) веб-страницы.

Интересно, что шестигранник - не единственный способ указать цвета; это всего лишь одна цветовая модель. Мы также можем указать цвет чего-либо на веб-странице или в приложении, используя цветовую модель rgb. Они эквивалентны и всегда будут давать нам один и тот же цвет, просто синтаксис для написания цвета немного отличается.

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

Ладно, ладно, но при чем тут шестнадцатеричные числа? Ответ на это: ну, кажется, все!

Давайте посмотрим на взаимосвязь между шестнадцатеричными кодами и шестнадцатеричными числами, распаковав один из моих любимых цветов: Medium Candy Apple Red!

Раскрасьте город шестигранником!

Шестнадцатеричный код этого оттенка красного - # EC152E. Мы также можем представить это в модели rgb как rgb (236, 21, 46). Если они функционально эквивалентны и всегда будут давать нам один и тот же цвет в конце дня, как связаны эти два способа написания одного и того же цвета?

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

И помните, как мы узнали ранее, как мы можем представить один байт (8 двоичных цифр) всего двумя цифрами в шестнадцатеричном формате? Что ж, здесь это тоже важно. Потому что это означает, что один шестнадцатеричный код содержит все значение цвета, но занимает всего 3 байта (или 24 бита) информации.

Если вы когда-нибудь задавались вопросом, почему цветовая модель RGB допускает только значения от 0 до 255, теперь вы знаете причину этого! Это потому, что каждое из этих чисел в rgb составляет один байт или 8 бит. Мы уже знаем, что 8 бит дают 256 возможных комбинаций, поэтому теперь логика численного ограничения на значение цвета (от 0 до 255), надеюсь, должна быть немного более ясной.

Но что мне кажется самым крутым в шестнадцатеричных числах, используемых для представления цвета, так это то, что всего 6 шестнадцатеричных цифр мы можем учесть более 16 миллионов возможных цветов в спектре. Цвет меня удивил, потому что я не знал этого до сих пор!

Еще больше волшебных проклятий

Еще одно место, где вы могли встретить шестнадцатеричные числа, - это магические значения отладки или hexspeak, которые на самом деле представляют собой не что иное, как записанные (или выделенные) шестнадцатеричные числа. в память при запуске программы. Наиболее распространенный вариант использования волшебных значений отладки - это сбой программы; эти шестнадцатеричные числа настолько часто используются разработчиками, что они стали в некотором смысле «зарезервированными» - то есть они используются только для указания программисту, который выполняет или отлаживает код: «Что-то пошло не так. ! »

Существует множество примеров этих отладочных кодов, но некоторые из наиболее известных - DEADBEEF, DEADC0DE и D15EA5E. И да, это было частью того, откуда появился Leetspeak!

Вы также можете найти шестнадцатеричные числа в форматировании IP-адресов последней версии протокола! Интернет-протокол версии 6 (IPv6) был выпущен в конце девяностых, когда стало ясно, что у нас очень быстро закончатся уникальные IP-адреса для каждого устройства на планете! Новый способ представления IP-адреса в IPv6 - это восемь групп из четырех шестнадцатеричных цифр (2 байта или 16 бит в каждой группе) и может выглядеть примерно так:

2b2b:1821:a9ih:0000:0000:ff91:9ab0:1ee3

Только представьте, как преобразовать это в двоичный код! Именно это происходит, когда ваша машина обрабатывает каждый бит, и все это происходит невероятно быстро. Не знаю, как вы, но при мысли об этом у меня кружится голова, и я очень благодарен за простую абстракцию числа 16.

Ресурсы

Если вам понравилось читать о гексагонах и магических числах, ознакомьтесь с этими ресурсами ниже, чтобы узнать больше!

  1. Что абсолютно необходимо знать каждому программисту о кодировках и наборах символов для работы с текстом, Дэвид Зентграф
  2. Как работает шестнадцатеричный цвет?, StackOverflow
  3. Шестнадцатеричные числа, Питер Нейланд
  4. Шестнадцатеричные числа и наборы символов, BBC Bitesize
  5. Десятичное в шестнадцатеричное, Академия Хана