Вычислительная техника

Должен предупредить: машинный счет для меня темный лес. Будем потихоньку разбираться -неспешно и не очень глубоко. Буду благодарен за указание на косяки.

Здесь, как и на других страницах, курсивом будет дополнительная болтовня, не обязательная к прочтению.

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


Самое большое число, которое можно представить таким методом - 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.

Обучение арифметическим действиям с двоичными числами:

https://www.youtube.com/watch?v=_64mBE0JBG4

Механическая конструкция, суммирующая двоичные числа:

Тут хочется внести некую поправку в представления. Примеры со стаканами и счетной машиной наглядны, но у них есть серьезный изъян - камни и шарики при переполнении низших разрядов отбрасываются, но на деле же это не так: каждый прибавляемый "камень" или "шарик" остается "внутри" числа, увеличивая его "массу". Число - это своеобразный "мешок", в который мы складываем нечто при сложении и вынимаем из него при вычитании.

Поэтому правильнее будет представить процесс таким образом: при заполнении младшего разряда, мы будем "засовывать" камни друг в друга, уплотняя их таким образом в два раза, без изменения размеров (своеобразная термоядерная реакция), и уже такой уплотненный камень класть в стакан старшего разряда.

Получается очень наглядно - в каждом следующем разряде камень будет весить ровно в два раза больше, чем в предыдущем:

и суммарная масса будет равна массе исходных чисел. Еще:

Тут мы сложили две двойки друг с другом и попытались было засунуть полученную четверку в соответствующую (следующую) ячейку. Но на эту же ячейку претендовала другая четверка. Поэтому мы сложили две двойки и одну четверку в одну восьмерку и поместили в ячейку, предназначенную для восьмерок.

Вычитание. Как мы знаем из видео и опыта вычитания в десятичной системе, при необходимости мы осуществляем "заем" в старшем разряде:

В данном случае, мы "разбираем" более плотный камень на составляющие. Вычитание - это процесс "разборки" числа на части, не так ли?

Деление числа - это тоже разборка, но на равные, одинаковые части.

Отметим, что прочитав этот рисунок снизу вверх мы получим сложение 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.