Системы счисления

Одно и то же число, например 38, может быть записано в системах счисления с различным основанием: в двоичной системе счисления, в десятичной, восьмеричной, шестнадцатеричной и других.

В десятичной: 38
В двоичной: 100110
В восьмеричной: 46
В шестнадцатеричной: 26

Электронно-вычислительная машина под управлением программы оперирует данными. Эти данные вводятся извне, хранятся, преобразовываются из одного вида в другой и выводятся (поступают на внешние устройства или в оределённой форме выдаются пользователю). Важно понимать, что программа не создаёт новых данных, а только преобразует существующие.

Например, если человек вводит в ЭВМ некоторое число, то обычно оно записывается в привычной для человека десятичной системе счисления:

Введите число: 2018_

На самом деле таково оно только в голове у человека и, возможно, на экране ЭВМ. Уже с клавиатуры число поступает в ЭВМ в виде отдельных цифр, каждая из которых может быть выражена числом (от 48 до 57):

 2   0   1   8
50  48  49  56

Часто говорят, что в этот момент числа переходят в двоичную форму. Если говорить конкретнее, числа поступают в ЭВМ по нескольким проводам в виде электрического тока. Если, например, перевести число 50 в двоичную систему счисления, получится 110010. Учитвая, что всего на клавиатуре порядка 100 клавиш, число 50 можно передать по восьми проводам, подав напряжение на три из них:

1-й провод: нет напряжения
2-й провод: напряжение подано
3-й провод: нет напряжения
4-й провод: нет напряжения
5-й провод: напряжение подано
6-й провод: напряжение подано
7-й провод: нет напряжения
8-й провод: нет напряжения

Когда все цифры будут доставлены в ЭВМ, они снова сложатся в единое число (2018) уже в двоичной системе счисления: 11111100010.

В памяти ЭВМ это число может храниться, например, в виде электрических зарядов на конденсаторах или взаимной ориентации двух микроскопических магнитов. В любом случае оно будет какое-то время оставаться в двоичной системе счисления. Когда его потребуется вывести на экран, оно будет разбито на десятичные цифры и преобразовано в коды символов от 48 до 57.

Всё это обычно происходит незаметно для программиста, но программист должен хорошо понимать, что происходит с данными, с которыми имеет дело ЭВМ и его программа.

Основание системы счисления

Рассмотрим, что представлет собой обыкновенное десятичное число 537. Это сумма трёх чисел:

537 = 500 + 30 + 7

или трёх произведений:

537 = 5 * 100 + 3 * 10 + 7 * 1

Откуда в этом уравнении взялись числа 5, 3 и 7, можно догадаться — это цифры числа 537. Но откуда взялись числа 100, 10 и 1? Если бы мы выбрали в качестве исходного число побольше, то увидели бы ещё и 1000, 10000 и т. д. Всё это степени числа 10 — основания десятичной системы счисления.

10 в степени 0 = 1
10 в степени 1 = 10
10 в степени 2 = 100

Основание чисел в двоичной системе — не 10, а 2. Цифр в ней тоже не 10, а всего 2. Это ноль и единица.

Перевод в десятичную систему счисления

Переведём число 1010111 в десятичную систему счисления. Для этого пронумеруем цифры этого числа справа налево. Счёт будем начинать с нуля.

 1  0  1  0  1  1  1
 6  5  4  3  2  1  0 

Каждому порядковому номеру сопоставим соответствующую степень двойки.

 1  0  1  0  1  1  1
 6  5  4  3  2  1  0
64 32 16  8  4  2  1 

Возьмём те степени двойки, которым в исходном числе соответствуют единицы, и сложим их.

64 + 16 + 4 + 2 + 1 = 87

На самом деле, мы умножили 64, 16, 4, 2 и 1 на единицу, а 32 и 8 — на ноль.

64*1 + 32*0 + 16*1 + 8*0 + 4*1 + 2*1 + 1*1 = 87

Если бы исходное число было не в двоичной системе счисления, а, например, в восьмеричной, то пришлось бы каждую его цифру умножить на соответствующую степень числа 8.

Приведём ещё один пример. Возьмём число 375, записанное в восьмеричной системе счисления. Пронумеруем, начиная с нуля, его разряды справа налево и каждому номеру поставим в соответствие соответствующую степень восьмёрки.

 3  7  5
 2  1  0
64  8  1 

Помножим каждый разряд числа на степень восьмёрки, находящуюся под ним, а результаты сложим.

64*3 + 8*7 + 1*5 = 192 + 56 + 5 = 253

Для записи шестнадцатеричных чисел используется 16 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. При переводе шестнадцатеричного числа в другую систему счисления, следует цифру A воспринимать как число 10, цифру B — как число 11 и т. д. до 15.

Переведём число E4A в десятичную систему.

 E   4   A
 2   1   0
256  16  1 

  256*E  + 16*4 + 1*A  =
= 256*14 + 16*4 + 1*10 =
= 3584 + 64 + 10 = 3658

Перевод из десятичной системы счисления

Для того, чтобы перевести десятичное число в двоичную систему счисления, надо разбить его на различные степени двойки. Например, возьмём число 49.

49 = 32 + 16 + 1

Нужны именно различные степени двойки, то есть нельзя написать:
49 = 16 + 16 + 8 + 8 + 1

Среди выписанных степеней двойки определённые степени будут отсутствовать. Можно выписать и их тоже, но домножив их на ноль.

49 = 32*1 + 16*1 + 8*0 + 4*0 + 2*0 + 1*1

Если расположить эти степени двойки в убывающем порядке (мы это уже сделали), то останется выписать коэффициенты (то есть нули и единицы). Это и есть число 49 в двоичном виде: 110001.

49 = 32*1 + 16*1 + 8*0 + 4*0 + 2*0 + 1*1
        1      1     0     0     0     1
   →    110001

Другой метод состоит в том, чтобы делить исходное число на 2 нацело и выписывать получающиеся остатки. Остаток от деления любого числа на два может быть равен или 0 или 1. Эти нули и единицы, прочитанные задом наперёд и будут составлять двоичную запись числа.

 49 : 2 = 24 (остаток 1)  
 24 : 2 = 12 (остаток 0)
 12 : 2 =  6 (остаток 0)
  6 : 2 =  3 (остаток 0)
  3 : 2 =  1 (остаток 1)
  1 : 2 =  0 (остаток 1)

Процесс останавливается, когда
делимое становится равно нулю.

Выписываем остатки задом
наперёд (снизу вверх):
110001

Точно таким же способом можно переводить числа в систему счисления с любым другим основанием. Переведём для примера число 395 в шестнадцатеричную запись. Основание 16, поэтому делить будем на 16.

395 : 16 = 24 (остаток 11)
 24 : 16 =  1 (остаток 8)
  1 : 16 =  0 (остаток 1)

Выписываем остатки снизу вверх:
18B — это и есть ответ.
(вместо 11 пишем B)

Переводить из шестнадцатеричной системы счисления в двоичную или восмеричную можно гораздо проще, чем в десятичную. Это так потому, что числа 2, 8 и 16 связаны друг с другом как степени двойки. Поэтому каждой шестнадцатеричной цифре соответствует ровно четыре двоичных цифры. Например, шестнадцатеричная цифра A всегда и везде будет выглядеть в двоичной форме как 1010. Восьмеричной же цифре соответствует три двоичных. Например, 7 соответствует 111.

Переведём число 94 54 3C 9C в двоичную запись.

9 → 1001     4 → 0100     5 → 0101
3 → 0011     C → 1100
94 54 3C 9C → 10010100 01010100 00111100 10011100

Вопросы к лекции «Системы счисления»

1. Зачем нужна двоичная система счисления?

2. Переведите из двоичной системы счисления в десятичную число 11010110.

3. Переведите из шестнадцатеричной системы в десятичную число AB.

4. Какие из следующих восьми двоичных чисел чётные? Постарайтесь ответить на вопрос, не переводя числа в десятичную систему счисления.

10001010    00001001    00001111    11111111
11101001    00111000    00011100    01010101

5. Меняется ли величина, обозначаемая некоторым числом, если это число записать в другой системе счисления?

6. Как в двоичной записи будет выглядеть число 16?

7. В чём удобство шестнадцатеричной системы счисления, если её сравнивать с десятичной?

8. Переведите в двоичную и восьмеричную запись шестнадцатеричное число EE A0 03 F7 6F.

9. Переведите число 58 в двоичную запись двумя способами.

10. Переведите число 781 в шестнадцатеричную запись, не используя двоичную в качестве промежуточной.