Бинарные числа

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

С точки зрения теории информации бит — это минимальный квант данных. На уровне электроники это наличие или отсутствие сигнала, включенная или выключенная лампочка. В числовом виде это представляется как 1 и 0 или по правилам логики True и False. Когда происходит программирование микроконтроллеров, то в зависимости от поданного входящего сигнала происходит включение или выключение тока на исходящих портах. Наличие сигнала заставит светодиод светиться, а если его убрать то он перестанет.

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

Примеры байтов:

  • 00000000 — байт состоящий только из нулей
  • 11111111 — байт состоящий только из единиц

Есть договоренность, что сначала записываются нули, а потом значащие биты. Что позволяет записывать числа в двоичном виде:

  • 00000000 — это 0 записанный в бинарном виде
  • 00000001 — это 1

Для того чтобы в бинарном виде записать двойку можно сложить две бинарные единицы. При этом применяются обычные правила сложения в столбик с переносом единицы влево, только в отличии от десятичных чисел не когда сумма больше 10, а когда сумма больше 1:

+000000010000000100000010 \begin{array}{r} + \begin{array}{r} 00000001\\ 00000001\\ \end{array} \\ \hline \begin{array}{r} 00000010 \end{array} \end{array}

Три в бинарном виде будет выглядеть как 11, 4 - 100 и так далее.

Интересная особенность, что все степени двойки будут выглядеть как 1 и столько нулей в какую степень надо возвести 2:

20=1bin121=2bin1022=4bin10023=8bin100024=16bin1000025=32bin100000 \begin{array}{l} 2^0 = 1 \xrightarrow{bin} 1\\ 2^1 = 2 \xrightarrow{bin} 10\\ 2^2 = 4 \xrightarrow{bin} 100\\ 2^3 = 8 \xrightarrow{bin} 1000\\ 2^4 = 16 \xrightarrow{bin} 10000\\ 2^5 = 32 \xrightarrow{bin} 100000 \end{array}

Максимальное десятичное число которое можно записать в байт получается если все биты будут равны 1 и равно 2812^8 - 1 или 255. Степень двойки 8 как раз равна количеству бит в байте.

Для того чтобы отличать числа в бинарном виде и десятичные в Python их записывают с приставкой 0b:

>>> 0b11
3

Поскольку компьютеры работают только с числами да еще и на бинарном уровне, то для работы с текстом была специальная стандартная таблица символов ASCII (American Standard Code for Information Interchange), она устанавливает правила какому символу соответсвует какой номер. Что позволило с помощью бинарных кодов записывать текстовые символы. Эти стандарты были разработаны во времена телеграфа и вы можете себе представить что раньше через телеграф каждую секунду передавался один бит данных, а когда получалось 8 таких битов, то можно было из них получить какое-то число и сравнить его с таблицой символов. И получить например букву 'a'. Код символа можно проверить с помощью команды ord:

>>> ord('a')
97

Расширение ASCII

Для непечатных символов тоже есть свои коды.

>>> ord('\n')
10

Поскольку возможных текстовых символов гораздо больше чем 255 мест, то в последствии таблица была расширена новыми стандартами. Кирилические символы и иероглифы уже содержатся в расширенной таблице Unicode:

>>> ord('щ')
1097
>>> ord('現')
29694

Мы не будем рассматривать все возможности работы с бинарными данными в Python.