Папа у нас по профессии - программист. Казалось бы этим всё сказано. Идея двоичности постоянно витает в воздухе. Хотя, откровенно говоря, представить, что даже если в компьютере вся логика устроена таким образом, что сигнал либо есть, либо его нет (1-0), непонятно, зачем понимание этого надо держать в голове, если ты пользуешься современными языками программирования.
В прошлом году у нашего папы был день рождения, что, конечно, дело обычное.Яна испекла пирог, и поэтому о свечах подумать было некому. И тридцать четыре свечи в доме в стратегический момент не оказалось. Тогда папа-программист сказал, что ему вполне подойдёт то же число, представленное в двоичной системе счисления (свеча горит или не горит). Сказано - сделано. Яна говорит, что она "сама". Сама, так сама. Папа ей быстренько объясняет, сколько должно быть свечек и какие из них должны гореть, чтобы всё получилось (вообще с каждым годом всё больше важных процессов ускользают от моего внимания, но я ничего, я - радуюсь).
Прошёл год. И снова наступил папин день рождения. Пирог опять был испечён, а о свечках опять позаботиться забыли.
- Сейчас я в двоичной зажгу! - кричит Яна. На минуту (ну может быть две), склоняет голову и принимается что-то перебирать на пальцах, потом подпрыгивает и несётся на кухню.
Я сижу и мучительно пытаюсь понять, сколько же и чего надо. Это история не о том, что дочь уже умнее меня, а о том (в очередной раз), почему линейные уравнения в первом классе я считаю скорее вредными, чем полезными. А моей голове всплывает урок информатики, седьмой класс. Нам как раз объясняли, что логика компьютера пользуется двоичным сигналом (есть сигнал - нет), и поэтому всё в компьютере зашито в двоичную логику (на бумаге, или в строчке это выглядит, как 1-0). Дальше нам показали, как из десятичной системы переводить в двоичную и наоборот. Мы делали это на листочке. На этом наше обучение закончилось, понимание можно было использовать для игры в то, кто умнее. Мне помнится, что надо было делить на два, пока делится, а потом выписать всё в обратном порядке. Такая схема. Внутренняя логика тогда от меня оказалась скрыта, а теперь на понимание у меня ровно одна минута, потому что если уж я не успела посчитать первая, то мне надо хотя бы проверить верность результата. Впрочем, дочь уже вернулась, расставила шесть свечей и помчалась назад за спичками.
У нас в гостях по стечению обстоятельств оказался один мой друг. У него растёт сын, и он очень интересуется моими "педагогическими наработками". И я ему говорю:
- Ну вот представь себе, как я должна её научить считать столбиком числа, сумма которых не выходит из сотни, если она с такой скоростью переводит в уме числа из десятичной системы в двоичную (впрочем, я подозреваю, что она больше запомнила, чем поняла, но теперь ей предстоит зажечь всё же другое число - не такое, какое было в прошлом году).
- Мощности не те, - парирует друг.
- Да, она и четырёхзначные в уме складывает. Она и двоичную в уме переводит.
- Я на пальцах! - несётся по квартире.
- Видал, она на пальцах. Не хочет, чтобы я её перехваливала. Всего лишь "на пальцах".
Папин день рождения в этом году тоже праздновали дважды - второй раз с друзьями. И в какой-то момент я зажгла свечи не совсем в правильном порядке. Тридцать пять выглядит так, что с одной стороны горит одна свеча, а с другой - две подряд. Читаем мы их по-прежнему слева направо.
- Мама, наоборот! - расстроено причитает дочь.
Хорошо, что у меня такой муж, что способен спасти мою честь одним движением руки - развернув торт.
P.S. Вероятно, Вы заметили, что способ, которым учили переводить в двоичную систему меня не так уж плох сам по себе. Проблема в том, что его надо было освоить по программе, и это заодно тот редкий случай, когда его, в сущности, так и не получилось притянуть за уши ни для чего в жизни, поэтому он остался мёртвым.
Он и сейчас, вероятно, да и наверняка не очень-то нужен. Но всё же привожу мастер-класс по переводу между системами счисления от своего мужа - вдруг кому пригодиться.
Приложение 1. Мастер - класс по переводу между системами счисления от
Александра Q.
Переводить из десятичной в двоичную проще, если сперва научиться переводить из двоичной в десятичную.
Берём число, например, 100010. Порядок разрядов пусть будет привычный - младшие разряды справа, старшие слева (то есть, как 90 у нас больше, чем 09, так и 10 в двоичной системе больше, чем 01).
У нас 6 цифр. Переводим в десятичную так: нумеруем разряды справа налево, начиная с 0. Таким образом, в разрядах номер 5 и номер 1 у нас стоит единица, а во всех остальных (4,3,2,0) - ноль.
Для каждого из разрядов, где стоит единица, мы возводим число 2 (основание нашей, двоичной, системы счисления) в номер разряда, и складываем то что получилось. То есть, 2^1 + 2^5 (знаком ^ мы тут обозначаем возведение в степень).
2^1 + 2^5 = 2 + 32 = 34.
Строго говоря, в остальных разрядах мы тоже возводим двойку в номер разряда, домножаем на то, что в этом разряде стоит, и добавляем к результату. То есть
100010 (в двоичной) = 0*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 0*2^4 + 1*2^5 = 2 + 32 = 34. В таком виде это работает для любой системы счисления.
А теперь, обладая этим знанием, можно переводить числа из десятичной системы в двоичную. Для этого было бы полезно запомнить степени двойки сколько получится. Я запомнил две: 2^5 = 32, 2^10 = 1024. Остальное легко получить несколько раз домножив или поделить ближайшую известную степень на 2.
Мы берём нужное число (пусть это будет 35) и вычитаем из него самую большую степень двойки, которая меньше этого числа. В данном случае это 32 = 2^5. Запоминаем этот факт, остаётся 3. Повторяем этот фокус до тех пор, пока не останется 0: вычитаем первую степень 2=2^1, остаётся 1; вычитаем нулевую степень 1=2^0, остаётся 0.
Подводим итог: мы вычитали степени номер 0, 1 и 5. Пишем справа налево результат, записывая 1 в разряды тех степеней, которые мы вычли, и 0 во все остальные:
100011.
Итак, перевод из десятичной системы в двоичную сводится к вычитанию степеней двойки. А обратно - к сложению.
Что касается порядка разрядов: существуют различные способы представления чисел в памяти компьютеров, в том числе и в порядке “от меньшего к большему”. В таком порядке число “сто двадцать три” было бы записано как “321”. Так что торт, вообще говоря, вращать было необязательно, но я не успел об этом рассказать.
Нужно ли это знать? Нет. Иногда может оказаться полезно или интересно, и тогда это запомнится само.
Знание о том, как хранятся числа в памяти компьютера, может помочь пониманию ограничений и некоторых классов ошибок в программировании.
Например, существует известная ошибка, когда добавив к большому числу другое мы получим отрицательное число. Это связано с тем, что для целых чисел последний (старший) разряд используется для хранения знака числа. Если у нас используется три разряда для числа и 1 для знака, то добавив к числу 0111 (7) число 0011 (3), мы получим 1010 (10, но если старший разряд используется для хранения знака - то -2).
Например, в какое-то место (база данных) мы почему-то не можем записать число больше 65535. Зная, что это число представляет собой 1111 1111 1111 1111 можно сделать вывод, что туда можно сохранить только 16-битовое число, причём только положительное (мы видим, что старший разряд не используется для хранения знака). Это знание поможет нам найти способ решить или обойти проблему.
А ещё внимательно смотрите на характеристики жёстких дисков при покупке, 1000ГиБ (гибибайт) - это гораздо больше, чем 1000ГБ (гигабайт).