Почему мы считаем десятками
В повседневной человеческой практике используется десятичная система счисления. Она кажется настолько привычной, что люди редко задумываются о ее природе. Кажется, что по-другому и быть не может.
Однако причина этого явления может быть найдена довольно легко: десятками, судя по всему, наши далекие предки начали пользоваться лишь потому, что в качестве счетного материала использовали собственные пальцы - первый "компьютер", который всегда имели при себе (за исключением некоторых инвалидов).
Позднее привычка считать десятками закрепилась в виде арабских цифр и составляемых из них чисел:
1 2 3 4 5 6 7 8 9 10
Те, кто немного знаком с программированием знают, что этот ряд удобнее было бы записать как
0 1 2 3 4 5 6 7 8 9
Именно с номера 0, а не с единицы принято начинать в большинстве языков программирования отсчет ячеек массивов, итераций в циклах и т.п.
Более внимательный взгляд на историю математики позволяет увидеть, что в прошлом люди были не так уж консервативны в том, что касается счета.
Во многих языках сохранились специальные слова, обозначающие числа 11 и 12. В английском это eleven и twelve, в немецком - elf и zwölf. В русском есть слово "дюжина", до сих пор активно используемое. Можно задаться вопросом, почему, например,13 по-английски будет thirteen, 14 - fourteen, а 11, почему-то, - не oneteen, а eleven?
Ответ, скорее всего, заключается в том, что в связи с развитием торговли в средние века людям было удобнее считать дюжинами, чем десятками. 12 хорошо делится на 2, 3, 4, 6. Число оказалось настолько удобным, что даже количество минут в часе и часов в сутках сделали кратным 12.
Как позднее показали математики Нового времени (прежде всего Готфрид Лейбниц, годы жизни 1646 - 1717), основанием системы счисления может быть любое натуральное число, а не только 10, доминантное положение которого обусловлено лишь физиологической особенностью человеческого организма.
Рисунок 1. Готфрид Вильгельм Лейбниц. Автор24 — интернет-биржа студенческих работ
Двоичная система счисления как математический курьез
Лейбниц, развивая теорию о разнообразии систем счисления, довел ее до крайнего случая, задавшись вопросом: каким минимальным количеством цифр можно обойтись при создании искусственных систем счисления? Ответ очевиден - двумя. Никак не обойтись без нуля, поскольку даже простейшая арифметика нуждается в выражении ситуации, когда считать нечего. Не обойтись также без единицы, поскольку нужно же как-то обозначать наличие подсчитываемых предметов. А вот без остальных цифр и чисел обойтись вполне можно, поступая, например, так, как дети на ранних этапах обучения счету:
0 = 0
1 = 1
11 = 2
111 = 3
1111 = 4
11111 = 5
...
Рисунок 2. Алгоритм перевода чисел из десятичной системы в двоичную. Автор24 — интернет-биржа студенческих работ
Этот способ, конечно же, примитивен и неудобен. Уже для записи числа 100 потребуется слишком много места. Но если использовать перенос разрядов, как мы это делаем при десятичном счете, то двоичная система оказывается не так уж и абсурдна. Например, для числа 15 у нас нет специальной цифры, поэтому мы прибегаем к ее представлению в виде 1 десятка и 5 единиц. Для записи числа 123 задействуем уже 3 разряда. Оказывается, так можно поступать и в любой другой системе счисления, в том числе в двоичной:
0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5
110 = 6
111 = 7
1000 = 8
...
Длина чисел по-прежнему растет быстрее, чем в десятичной системе, но уже не так угрожающе быстро.
Почему двоичная система удобна для создания счетных машин
У двоичной (бинарной) системы есть одно важное преимущество: она очень устойчива, и если уж создавать механизмы, способные автоматизировать арифметические операции, то на ее основе. Уже Лейбниц пытался воплотить эту идею, но не довел до конца. Видимо, не хватило инженерных навыков.
Преимущества двоичной системы для создания электронных вычислительных машин понять довольно легко. Допустим, мы решили построить электронный компьютер, основанный на десятичной системе счисления. Для кодировки 10 цифр нам потребуется 10 уровней напряжения.
Предположим, что это будут 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9 вольт соответственно. Если подавать такие сигналы на обычный стрелочный вольтметр, то окажется, что можно хорошо на глаз различить показания для уровней, скажем, в 2 и 4 вольта. А вот разница между 8 и 9 вольтами будет едва заметна, и даже 7 вольт от 9 человек с ослабленным зрением не сможет четко различить. Зато разница между отсутствием напряжения (0) и его наличием (1) всегда хорошо заметна.
На этом и основана двоичная система счисления, используемая в современных компьютерах. За единицу там принимается уровень сигнала, допустим, в 5 вольт, а за 0 - некоторый близкий к нулевому электрическому потенциалу диапазон значений (допустим, менее 0,5 вольта). Электроника прекрасно различает эти два уровня, тогда как, например, 8 вольт может легко превратиться и в 7, и в 9, если в электрической цепи возникнут какие-нибудь помехи.
Системы счисления, производные от двоичной
Итак, в электронно-вычислительных машинах (компьютерах) вся информация хранится и обрабатывается в бинарном формате. Каждому разряду в двоичном числе соответствует 0 или 1. Такой разряд называется битом. Например, с помощью двух бит можно записать числа
0 (0)
1 (1)
10 (2)
11 (3)
Предпринимались небезуспешные попытки создавать компьютеры на основе троичной логики, но такие машины не обрели особой популярности.
Спецификой обработки двоичных данных является то, что в регистры процессора они попадают порциями определенного размера: по 4, 8, 16, 32, 64 разряда за одну простейшую операцию (такт). Сколько именно разрядов обрабатывает процессор за 1 такт, зависит от его архитектуры. Большинство современных процессоров работают с 64-разрядными данными, а в 1970-х компания Intel начинала свою деятельность с 4-разрядных процессоров, которым быстро пришли на смену 8-разрядные. Именно тогда 8-битное число и получило большое распространение в программировании. За ним даже закрепилось особое название - байт. 1 байт содержит - 8 бит информации. Максимальное натуральное число, которое можно закодировать одним байтом - 255. С учетом числа 0, которое, конечно же, можно выразить с помощью байта, он может принимать 256 различных состояний.
Рисунок 3. Бит и байт. Автор24 — интернет-биржа студенческих работ
Со временем программисты пришли к выводу, что байты удобно записывать в виде 2-х шестнадцатеричных знаков. В шестнадцатеричном счислении, помимо обычных арабских цифр содержатся дополнительные символы:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
Чтобы записать число от 0 до 255 в 16-ричной кодировке, нужно задействовать два таких символа (их иногда называют полубайтами, тетрадами, нибблами и даже гексадецитами). Признаком того, что число записано в такой форме являются символы 0x
в его начале
01 = 0x01
02 = 0x02
03 = 0x03
...
09 = 0x09
10 = 0x0A
11 = 0x0B
...
15 = 0x0F
16 = 0x20
...
255 = 0xFF
Помимо шестнадцатеричной в программировании иногда применяется восьмеричная система счисления.