Бинарные числа
Работа с битами — это достаточно специфическая задача. Если в будущем вы будете заниматься веб-программированием, то возможно вам никогда не придется работать с данными на таком уровне. Но если вы захотите запрограммировать какое-то устройство для интернета вещей, то уже больше шансов. Мы не будем подробно останавливаться на том, как именно происходит работа с данными на уровне битов, но на самом деле это достаточно интересный мир внутри большого мира программирования, поэтому давайте получим какое-то вводное представление на базовом уровне.
С точки зрения теории информации бит — это минимальный квант данных. На уровне электроники это наличие или отсутствие сигнала, включенная или выключенная лампочка. В числовом виде это представляется как 1 и 0 или по правилам логики True и False. Когда происходит программирование микроконтроллеров, то в зависимости от поданного входящего сигнала происходит включение или выключение тока на исходящих портах. Наличие сигнала заставит светодиод светиться, а если его убрать, то он перестанет.
Для вычислений были придуманы последовательности из определенного количества битов, которые называются байты и если их объединить вместе, то у них появляются новые интересные свойства. Обычно байтом называют последовательность из 8 битов, но на самом деле может быть и больше. Если такое возможно, то для того, чтобы отличать байт, состоящий из 8 бит называют октетом. Это стандарт, который прослеживается во множестве оборудования и разной электронике. На самом деле любой код, который выполняется на компьютере глубоко внутри превращается в бинарные операции с байтами.
Примеры байтов:
00000000— байт, состоящий только из нулей11111111— байт, состоящий только из единиц
Есть договоренность, что сначала записываются нули, а потом значащие биты. Что позволяет записывать числа в двоичном виде:
00000000— это 0 записанный в бинарном виде00000001— это 1
Для того чтобы в бинарном виде записать двойку можно сложить две бинарные единицы. При этом применяются обычные правила сложения в столбик с переносом единицы влево, только в отличии от десятичных чисел не когда сумма больше 10, а когда сумма больше 1:
math
\begin{array}{r}
+
\begin{array}{r}
00000001\\
00000001\\
\end{array} \\
\hline
\begin{array}{r}
00000010
\end{array}
\end{array}
Три в бинарном виде будет выглядеть как 11, 4 - 100 и так далее.
Интересная особенность, что все степени двойки будут выглядеть как 1 и столько нулей в какую степень надо возвести 2:
math
\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 и равно $2^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.

Проверка