Вычислительная техника
Должен предупредить: машинный счет для меня темный лес. Будем потихоньку разбираться -неспешно и не очень глубоко. Буду благодарен за указание на косяки.
Здесь, как и на других страницах, курсивом будет дополнительная болтовня, не обязательная к прочтению.
Прежде, если человеку было необходимо что-нибудь посчитать, он использовал собственные пальцы. Каждый поднятый палец соответствовал одному предмету.
Самое большое число, которое можно представить таким методом - 10. Если количество предметов подлежащих учету больше 10, приходилось использовать что-то еще: пальцев-то больше нет. К примеру, при записи на бумаге чисел больше 9, мы используем следующий разряд, то есть приписываем левее цифру, указывающую количество десятков в данном числе: 9, 10,11 и т.д.
Например, число 39 означает три десятка и 9 единиц ( 3*10+9, или 10+10+10+3). То есть, если число в первом (правом) разряде означает 9 единиц, то тройка во втором разряде - три десятка.
Одна и та же цифра в каждом следующем разряде "весит" в десять раз больше, чем в предыдущем. Поэтому такая система записи называется позиционной - значение цифры зависит от ее позиции (положения).
Разберем число 333. Ясно что левая тройка "весит" ровно в 10 раз больше тройки по центру, а та, в свою очередь "тяжелее" правой тройки также в 10 раз. Можем разобрать это число на составляющие: 333 = 300 + 30 + 3.
Про такую систему счета говорят, что она имеет основание 10. Представим, что для счета мы используем не пальцы, а несколько высоких стаканов.
В каждый стакан влезает 9 камней.
Начинаем считать предметы, забрасывая камни в правый стакан (левый рисунок). Один предмет соответствует одному камню в правом стакане. После того, как он заполнился, для записи числа 10, мы высыпаем из него все камни, и кладем один камень в следующий стакан, левее первого (центральный рисунок). На правом рисунке записано число 463: четыре камня в стакане сотен, шесть в стакане десяток и три камня в стакане единиц.
Примерно такая же система используется в подзабытых ныне счетах:
В них единицы записывались сдвигом влево костяшек ряда, находящегося над прутом с четырьмя костяшками, десятки - сдвигом костяшек следующего ряда - над ним и так далее. Этот нехитрый прибор позволял осуществлять сложение и вычитание и, с некоторыми ограничениями, умножение и деление. Подробнее тут.
Более удобен соробан, очень успешно используемый в Японии для обучении устному счету.
Для откладывания числа от 1 до 4 используются четыре костяшки ниже горизонтальной планки. Число 5 откладывается перемещением костяшки над планкой. Числа от 6 до 9 откладываются сочетанием перемещения верхней и нижних костяшек (5+n), например, число 7 - перемещение верхней костяшки и двух нижних.
Эмулятор соробана здесь, описание работы на нем тут. Поигравшись с соробаном можно понять, что в упомянутых выше счетах одна костяшка на каждом пруте лишняя - достаточно 9 штук. Как и один палец на руках для системы с основанием 10 излишен.
А теперь представим себе, что пальцев на руках у нас было бы суммарно семь. Как бы в этом случае выглядела наша система счета? Получается, что теперь наши стаканы с верхнего рисунка вмещали бы 7 камней, а для регистрации восьмого предмета нам пришлось бы высыпать все камни из правого стакана и положить один камень во второй стакан. Заметим, что в этой системе, называемой восьмеричной, каждый камень в стакане старшего разряда "весит" уже не в 10 раз тяжелее, а в восемь. Число 10 в восьмеричной системе означает 8 + 0, то есть, равно восьми.
Число 30 - это три раза по восемь: 3*8 + 0, или 8 + 8 + 8 + 0 = 24.
Так как число в каждом следующем разряде "весит" больше такого же числа в предыдущем в восемь раз, число 111 - это 64 + 8 + 1 = 73. Единица в третьем разряде равна 8*8 = 64.
222, соответственно, 64*2 + 8*2 + 2 = 146, ибо 200 = 128, 20 = 16, ну а двойка младшего разряда равна сама себе - двум.
Аналогично, в шестнадцатеричной системе, каждый старший разряд больше предыдущего в 16 раз. Но тут засада - не придумано цифр больше 9. Как вписать в один разряд (в одно место), к примеру, 10? Для этого используется латинский (читай - английский) алфавит. Число 10 обозначается буквой A, 11 - B и так далее:
1 - 1
2 - 2
3 - 3
4 - 4
5 - 5
6 - 6
7 - 7
8 - 8
9 - 9
10 - A
11 - B
12 - C
13 - D
14 - E
15 - F
Соответственно, число F0 в этой системе равно 15*16 = 240, а FF 15*16 + 15 = 255, 100 = 256.
Таблица сложения в шестнадцатеричной системе:
Человеку психологически сложно быстро перестроиться на другую систему счисления - он считает ее "неудобной". Но вспомним о еще более геморной системе счисления, которой мы, тем не менее, пользуемся ежедневно. Речь об учете времени. В этой системе основание и вовсе переменное: секунда делится тысячные доли - миллисекунды. Это, вроде как, десятичная система.
Шестьдесят секунд образуют минуту, шестьдесят минут - один час. На этом уровне система шестидесятеричная.
Далее, 24 часа образуют сутки. Основание системы - 24.
А сутки образуют месяц и вовсе как бог на душу положит - варианты от 28 до 31. Такие дела.
Самая "крутая" система счисления имеет основание 2 (двоичная система) - меньшего основания не бывает. Именно такой системой оперируют вычислительные машины. Ибо любой переключающий элемент (типа выключателя, которым вы включаете свет) электрической машины может иметь два состояния - включено и выключено. Поэтому иные системы счисления машине не то чтобы недоступны, но их применение усложняет как саму машину, так и работу с ней.
В двоичной системе счисления используются всего две цифры - 0 и 1. И, как можно понять из прочитанного выше, соседние разряды чисел, записанных в двоичной системе отличаются в два раза: 01 в двоичной системе это единица (один), а 10 - это два. Перемещение единички на разряд влево увеличивает ее "стоимость" вдвое.
Вновь обратимся к стаканам. Теперь вместимость каждого из них один камень. Соответственно, каждый стакан может быть всего в двух состояниях - пустом (0) или полном (1).
Возьмем, к примеру, пять стаканов и начнем с их помощью считать предметы. Сами стаканы рисовать не будем, представим только их содержимое в виде нулей и единиц:
1 - 0001
Точно так же, как и в предыдущих случаях, при переполнении правых стаканов (разрядов), мы высыпаем из него камни (в данной системе счисления - один), и добавляем камень в стакан старшего разряда:
2 - 0010
Аналогично продолжаем раскидывать камни дальше.
3 - 00011
4 - 00100
5 - 00101
6 - 00110
7 - 00111
8 - 01000
9 - 01001
10 - 01010
11 - 01011
12 - 01100
13 - 01101
14 - 01110
15 - 01111
16 - 10000
Нули левее самой левой единицы - не значащие. В десятичной системе мы тоже можем к любому числу приписать слева нули, и его значение при этом не изменится: 9 = 09 = 00009.
Может показаться, что данная система не экономична: для двоичной записи числа 16 требуется пять знаков - 10000, в то время, как в десятичной системе достаточно двух. Но давайте посмотрим с несколько иной точки зрения. У нас на руках 10 пальцев. И самое большое число, которое мы можем ими "изобразить", соответственно, 10. Сколько же чисел можно показать на пальцах в двоичной системе? Каждый палец у нас будет соответствовать одному разряду двоичной системы. Загнутый палец будет нулем, выпрямленный - единицей. Разрядов (пальцев) у нас десять. Разверните руки ладонями к себе и сожмите пальцы в кулаки. Это будет 00000 00000, то есть, ноль (левая группа цифр - левая рука, правая группа - правая рука). Теперь выпрямите большой палец правой руки. Это будет единица: 00000 00001. Убрав большой палец и выставив указательный, получаем двойку: 00000 00010. Выпрямленные большой и указательный пальцы - тройка: 00000 00011 и так далее. Если же мы выпрямим все пальцы на обеих руках, получим число 11111 11111. В двоичной системе это число равно 1023. Именно столько чисел можно показать на пальцах в двоичной системе. Круто, да? Сравните с жалкой десяткой в десятичной системе.
Если же мы попытаемся использовать каждый палец, как разряд десятичной системы, например, постепенно разгибая каждый палец на 1/10, получится не очень хорошо: хотя вместимость такой системы будет гигантской (99999 99999), пользоваться ею будет крайне неудобно, ибо сложно будет отличить, к примеру, 5 от 6 и т.д. В общем, двоичная система, как говорится, "рулит".
Обратим внимание на выделенные "круглые" цифры верхнего столбца. Они представляют собой степени числа 2 (точно так же, как в десятичной системе "круглые" числа 1, 10, 100, 1000 и т.д. являются степенями основания десятичной системы, т.е., числа 10):
00001 = 1 = 2^0
00010 = 2 = 2^1
00100 = 4 = 2^2
01000 = 8 = 2^3
10000 = 16 = 2^4
Абсолютно любое число мы можем представить как сумму этих "круглых" (для данной системы) чисел:
11 - 01011 это
8 - 01000
+
2 - 00010
+
1 - 00001
Видно, что раскладывая двоичное число 11 на "круглые", мы просто выдернули из него единицы - вторую, четвертую и пятую.
Отсюда следует, что складывать двоичные числа (сложение - процесс обратный разложению числа на "запчасти"), мы можем просто складывая единицы соответствующих разрядов:
3 - 00011
+
4 - 00100
_____________
7 - 00111
Если же в складываемых числах имеются единицы в одинаковых разрядах (при сложении столбиком - друг под другом), в данный разряд пишется ноль, а единица сдвигается в старший разряд, точно так же, как и в десятичной системе при переполнении соответствующего "стакана".
1 - 00001
+
1 - 00001
_______________
2 - 00010
Сравните с десятичным примером:
5
+
5
_______
10
Здесь тоже правый разряд заполнился, мы записали единицу в старший разряд, а в младшем получился ноль.
Попутно заметим, что сложение двух одинаковых чисел есть умножение на 2 (3+3 = 3*2), поэтому в двоичной системе умножение на 2 производится простым сдвигом всех цифр числа на один разряд влево, к примеру, 3+3:
00011
+
00011
__________
00110
Точно так же, как в десятичной системе умножение на 10 (на размер основания системы счисления) производится простым сдвигом цифр на разряд влево: 00032*10 = 00320.
Соответственно, деление на 2 в двоичной системе производится сдвигом цифр числа вправо на один разряд, деление на 4 - сдвигом на два разряда и так далее. В десятичной системе аналогичный сдвиг производится при делении на 10 и 100: 500:10 = 050, 500:100 = 005.
Обучение арифметическим действиям с двоичными числами:
Механическая конструкция, суммирующая двоичные числа:
Тут хочется внести некую поправку в представления. Примеры со стаканами и счетной машиной наглядны, но у них есть серьезный изъян - камни и шарики при переполнении низших разрядов отбрасываются, но на деле же это не так: каждый прибавляемый "камень" или "шарик" остается "внутри" числа, увеличивая его "массу". Число - это своеобразный "мешок", в который мы складываем нечто при сложении и вынимаем из него при вычитании.
Поэтому правильнее будет представить процесс таким образом: при заполнении младшего разряда, мы будем "засовывать" камни друг в друга, уплотняя их таким образом в два раза, без изменения размеров (своеобразная термоядерная реакция), и уже такой уплотненный камень класть в стакан старшего разряда.
Получается очень наглядно - в каждом следующем разряде камень будет весить ровно в два раза больше, чем в предыдущем:
и суммарная масса будет равна массе исходных чисел. Еще:
Тут мы сложили две двойки друг с другом и попытались было засунуть полученную четверку в соответствующую (следующую) ячейку. Но на эту же ячейку претендовала другая четверка. Поэтому мы сложили две двойки и одну четверку в одну восьмерку и поместили в ячейку, предназначенную для восьмерок.
Вычитание. Как мы знаем из видео и опыта вычитания в десятичной системе, при необходимости мы осуществляем "заем" в старшем разряде:
В данном случае, мы "разбираем" более плотный камень на составляющие. Вычитание - это процесс "разборки" числа на части, не так ли?
Деление числа - это тоже разборка, но на равные, одинаковые части.
Отметим, что прочитав этот рисунок снизу вверх мы получим сложение 2 + 3 = 5 с "уплотнением" двух двоек в одну четверку.
Понятно, что машина такой фигней не страдает, и пересчитывает числа формально . Но для понятия сути счета, приведенные выше представления полезны.
Еще раз повторим, что каждая единичка двоичного числа соответствует некоему десятичному, в зависимости от места (разряда), которая эта единичка занимает.
Напишем ряд, который поможет нам переводить число из двоичной системы в десятичную:
В нижней части рисунка пример пересчета: просто суммируем числа над единичками:
0101100102 = 17810.
Маленькие циферки 2 и 10 справа внизу обозначают основание системы счисления - соответственно двоичную и десятичную.
Обратное десятично-двоичное преобразование производится многократным деление делением числа на два с записью остатка при каждом делении. Этот остаток в каждом случае будет либо ноль, либо единица. Данный ряд затем записывается в обратном порядке - снизу вверх:
В данном примере преобразуется десятично число 65. Записывая единички и нули остатков, снизу вверх, получаем двоичное число 1000001.
Есть и иной способ. Вспомним числовой ряд для двоично-десятичного пересчета:
256 128 64 32 16 8 4 2 1 (понятно, ряд можно продлить влево до бесконечности).
Каждое из этих чисел соответствует единичке на определенном месте двоичного числа.
Берем десятичное число, к примеру, опять 65. Находим в нашем эталонном ряду ближайшую цифру, меньше 65 - это 64. 64 находится на седьмом месте, считая справа. Значит, в нашем двоичном числе на седьмом месте (с конца) будет единичка.
Теперь вычтем 65 - 64, получим один. Единичка в эталонном ряду находится в крайнем правом положении. А значит, в двоичном числе правая цифра также будет единичка. Все остальные цифры - нули: 6510 = 100000012.
Попробуем таким же образом разложить число 500. Ближайшее меньшее число эталонного ряда - 256, находится на девятом месте с хвоста. Стало быть, на девятом месте с хвоста в двоичном числе будет единичка.
Из 500 отнимаем 256, получаем 244. Ближайшее число - 128 на восьмом месте. Значит, и в двоичном числе на 8 месте будет единичка.
Далее: 244 - 128 = 116. Ближайшее 64 - на 7-м месте. Пишем единичку на седьмом месте.
116 - 64 = 52. 32 - на шестом месте. Единичка в двоичном на шестом месте.
52 - 32 - 20. Ближайшее 16 - на пятом месте. Пишем единичку.
20 - 16 = 4. Четверка на третьем месте. Пишем единичку.
Все, остатков нет. Смотрим: у нас единички на 9, 8, 7, 6, 5 и 3 местах. Записываем двоичное число: 111110100.
По сути, при таком разложении, мы поочередно минусуем из десятичного числа степени двойки:
500 - 256 - 128 - 64 - 32 - 4 = 0.
Или, можно сказать, что мы раскладываем число на степени двойки:
500 = 256 + 128 + 64 + 32 + 4.