Приобретая знания в средней школе, потом в институте, мы учимся математике и другим наукам в десятеричной системе исчисления. Вся наша обыденная жизнь связана только с ней. Время, деньги, разные физические величины представляются нами только в виде цифр от нуля до девяти.
Ранее, в статье «Введение в информатику. Алгоритмы», я кратко пояснил, что любая цифровая техника от простейшего устройства автоматики до компьютера оперирует всего двумя логическими состояниями «ноль» и «единица». Информация хранится в ячейках памяти, которые могут быть «долговременными», а могут быть оперативными – «кратковременными». К долговременным относятся постоянные запоминающие устройства (ПЗУ) на микросхемах, магнитных лентах и дисках не требующие во время хранения информации питающего напряжения (флеш-карта, дискета, или жёсткий диск компьютера). Оперативные ячейки памяти хранят информацию в течение времени, необходимого для проведения вычислений и требуют постоянного питающего напряжения (оперативное запоминающее устройство компьютера, кэш-память микропроцессора). Минимальная ячейка памяти способна хранить единицу информации — один бит, который может принимать значение равное нулю, либо единице. Восемь битов – это уже байт. Если один бит информации может принимать два значения — от 0 до 1, то сочетание нулей и единиц одного байта может принимать 256 значений — от 0 до 255.
Говорят: компьютер имеет 64-х разрядную шину данных. Это означает, что одновременно его информационная шина способна передавать 64 бита информации от одного функционального узла (устройства) компьютера к другому. 64 / 8 бит = 8 байт . Нет смысла говорить о том какой это большой, или маленький объём информации, ведь всё в мире относительно. Следующая единица информации это килобайт – одна тысяча байт. Далее мегабайт – один миллион байт. Далее терабайт – один миллиард байт.
Мой первый компьютер в 1990 году имел оперативную память равную 16 килобайт, а в качестве ПЗУ использовалась магнитофонная кассета, на которой файлы размером больше 20 килобайт записывать не рекомендовалось (сбоили), на всю кассету помещалось не более 400 килобайт. В 1997-м году у меня был компьютер с оперативной памятью 16 мегабайт и 4-х гигабайтным жёстким диском, в 2002-м году — компьютер с оперативной памятью 256 мегабайт и 80-ти гигабайтным жёстким диском, а в 2014-м году у меня компьютер с оперативной памятью 4 гигабайт и жёстким диском (ПЗУ) в один терабайт. Время бежит вперёд, техника тоже прогрессирует. Скоро и эти объёмы памяти будут смешными.
Вернёмся к битам и байтам и определимся что такое двоичный код. Один байт – это 8 бит. Биты в байте располагаются в следующем порядке:
Как и в десятичной системе исчисления, в двоичной системе также принято делить числа на разряды. В десятичном представлении чисел принято писать слева направо — старшие разряды, потом младшие. Взглянув на число, по количеству символов, мы сначала определяем, к какому порядку число относится (единицы, десятки, сотни и т.д.). Потом посмотрев на впереди стоящую цифру, определяем размерность старших разрядов. Потом последовательно переходим на младшие числа (разряды). Это удобно для нашего восприятия. В двоичной системе абсолютно всё также, старший бит (разряд) располагается слева, правее располагается бит (разряд) по младше, и т.д. до самого младшего — первого.
А теперь попробуем понять определение из учебника информатики:
«За единицу количества информации принимается такое количество информации, которое содержится в информационном сообщении, уменьшающем неопределённость знания в 2 раза. Такая единица названа битом»
Бит – это единица информации. Информационное сообщение может состоять из одного бита, двух битов, трёх битов и т.д. до бесконечности.
Один бит информации может принимать 2 значения: 0, или 1. Второй бит информации также может принимать 2 значения: 0, или 1. Но когда биты объединены в одно сообщение, то это сообщение может иметь 4 различных значения – комбинаций состояния битов (значение равное 0, 1, 2 или 3). Третий бит информации также может принимать 2 значения: 0, или 1. В сумме три отдельных бита могут принимать 6 значений, но объединённые в одно информационное сообщение, в зависимости от состояния битов (комбинаций нулей и единиц), само сообщение может принимать 8 различных значений (от 0 до 7). Четвертый бит информации также может принимать 2 значения: 0, или 1. В сумме четыре отдельных бита могут принимать 8 значений, но объединённые в одно информационное сообщение, в зависимости от состояния битов (комбинаций нулей и единиц), само сообщение может принимать 16 значений (от 0 до 15).
Обратите внимание, что добавление каждого нового бита увеличивает варианты состояний (информации) в 2 раза. Как было написано ранее, один бит хранит информацию от 0 до 1 (два логических состояния). Если мы будем использовать 2 бита, то мы увеличим размерность хранящейся информации вдвое – от 0 до 3 (четыре логических состояния). Если мы будем использовать 3 бита, то размерность информации увеличится ещё в два раза – от 0 до 7 (восемь логических состояний). Используя 4 бита, мы увеличиваем размерность информации ещё в два раза – от 0 до 15 (шестнадцать логических состояний). Использование каждого последующего бита увеличивает размерность информации вдвое. Поэтому на многих схемах разрядность битов подписывают 1, 2, 4, 8, 16, 32, 64, и т.д. умножая на 2. Для объяснения описанного, приведена таблица для 4-х разрядов (полубайта):
Чтобы записать любое десятичное число в двоичной системе, или наоборот перевести из двоичной в десятичную, можно воспользоваться следующей табличкой:
Эта табличка используется для размерностей чисел в пределах 2-х байт – от 0 до 65 535. Если Вам необходимо пересчитывать более крупные числа, тогда можете продолжить табличку самостоятельно, учитывая закономерность, что каждый следующий бит, имеет разрядность в два раза больше предыдущего.
Например: Вы хотите определить, как будет выглядеть двоичный код числа 12 345. Берём табличку, добавляем ещё одну строку, назовём её «Состояние битов» и начнём вычислять:
Вычисление производится от старшего бита, старшего байта.
Находим в таблице старший бит (разрядность которого максимальна), но меньше, или равна этому числу. В нашем случае восьмой бит старшего байта имеет разрядность 32 768, это больше числа 12 345, поэтому ставим в табличку 8-го бита «0», тоже самое произойдёт и с 7-м битом. Разрядность 6-го бита 8 192 меньше числа 12 345, поэтому ставим в табличку «1».
После этого делаем вычисление — от искомого числа отнимаем значение 6-го бита: 12 345 – 8 192 = 4 153. Проверяем разрядность следующего пятого бита: 4 096 меньше значения 4 153, тогда ставим «1», и повторяем отнимание: 4 153 – 4 096 = 57. Мы получили число 57. Разрядность 1-4 бита старшего байта и 7-8 бита младшего байта больше числа 57, поэтому ставим в табличку этих битов значения «0». Разрядность 6-го бита – 32 меньше числа 57, поэтому ставим в табличку цифру 1 и производим очередное отнимание: 57 – 32 = 25.
Проверяем разрядность 5-го бита – 16 меньше числа 25, поэтому ставим в табличку цифру 1 и производим очередное отнимание: 25 – 16 = 9.
Проверяем разрядность 4-го бита – 8 меньше числа 9, поэтому ставим в табличку цифру 1 и производим очередное отнимание: 9 – 8 = 1. Разрядность 3-го и 2-го бита младшего байта больше числа 1, поэтому ставим в табличку этих битов значения «0». Разрядность 1-го бита младшего байта равна числу 1, поэтому ставим в табличку этого бита значение «1».
Итак, мы получили двоичный код числа 12 345, который выглядит: 00110000 00111001.
Теперь наоборот, из двоичного кода получим десятичное число. Это намного проще.
Например: у нас имеется двоичное двухбайтное число: 10101010 10101010. Запишем его в нашу таблицу под соответствующие биты:
Нам остается теперь только сложить разрядности всех битов, значение которых равно единице: 2 + 8 + 32 + 128 + 512 + 2 048 + 8 192 + 32 768 = 43 690.
Что же такое шестнадцатеричный код? Это представление двоичного кода десятичными символами и буквами, необходимое разработчику программ для сокращённой записи двоичного кода. Компьютер на нём не работает, люди вычислений не делают. Четыре бита которые в двоичном коде имеют четыре цифры-символа, в шестнадцатеричном коде обозначаются всего лишь одним символом, один байт – двумя символами, два байта – четырьмя символами и т.д. по четыре бита на символ. Таким образом, один байт обозначается двумя символами шестнадцатеричного кода.
Соответствие символов шестнадцатеричного кода двоичному коду приведено в таблице:
Например: десятичное число 12 345, которое мы преобразовали ранее в двоичный код 00110000 00111001, в шестнадцатеричной форме выглядит: 30 39.
Двоичное число 10101010 10101010, которое мы преобразовали ранее в десятичное 43 690, в шестнадцатеричной форме выглядит так: АА АА.
Некоторые недоучки могут сказать: «Как, ведь компьютер только и работает, что в шестнадцатеричном коде!» Ничего подобного. По проводнику адресной шины компьютера, или шины данных может идти «единичка» в виде напряжения, или «нолик» в виде отсутствия напряжения. Это двоичный код. Но в неё никак не загнать символы шестнадцатеричного кода. Это, в отличие от наличия, или отсутствия напряжения, которое можно «потрогать языком» как на батарейке, всего лишь символы, без специальных программ понятные только человеку, а не машине.
Шестнадцатеричный код в настоящее время успешно используется в написании алгоритмов для микроконтроллеров, поэтому тот, кто активно занимается микроконтроллерами, должен знать шестнадцатеричный код. Я уж не говорю об ассемблере.
На первом своём компьютере, я писал маленькие программки в Ассемблере, вперемешку с Бейсиком, переводя в шестнадцатеричный код, после чего сохранял на внешнем носителе – магнитофоне, и лишь потом смотрел, что же получилось. Ассемблер – это язык программирования, который максимально близок к машинному коду ЭВМ. Для его перевода в «цифру», достаточно наименования команд программирования заменить на шестнадцатеричный код, который с помощью прошитого ПЗУ автоматически переводится в двоичный код. В настоящее время программы пишут на языках высокого уровня, которые сам компьютер не понимает без программ интерпретаторов, компиляторов и прочих других «буферных» программ и подпрограмм, которые в свою очередь перекладывают программы в шестнадцатеричный код, а потом аппаратными средствами – в двоичный код. Это является фактором, значительно снижающим быстродействие выполнения программ, так как компьютер выполняет «дополнительные» операции требующие затраты времени, но развитие компьютерной техники в настоящее время с её высокими скоростями обработки информации и обмена позволяет это делать. Как пример, приведу свой сайт, который вы сейчас читаете.
Все странички своего сайта я пишу в xml-овских тегах, с лёгкостью понятных для любых браузеров интернет-пользователей. Мои страницы занимают мизерный объём памяти и быстро открываются. Задержки могут возникать только в моменты обращения к серверу с открытием рисунков и рекламных тизеров. А многие другие владельцы сайтов пишут свои странички, используя шаблоны WordPress. При том же объёме информации, что и у меня, объём их страниц и время открывания браузером значительно больше. В данном случае, WordPress выполняя роль программы-компилятора замедляет работу. Кроме того, он может создавать «ненужные» теги и символы, которые не только замедляют работу браузеров, но и увеличивают размер файлов. Впрочем, если у вас «быстрый» интернет и «быстроходная машина», этого замедления вы и не заметите. Абсолютно также с замедлением работают все программы от операционных систем, до компьютерных игр. А побеждает по скорости та, которая в результате компиляции ближе к машинным кодам — преобразована с языка программирования высокого уровня в машинные коды с минимальными «ненужными» командами.
Не берусь судить о том, понятно ли я изложил суть темы статьи, но думаю, что в ней с достаточной полнотой даны понятия двоичного и шестнадцатеричного кодов.