Одно и то же число, например 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 в шестнадцатеричную запись, не используя двоичную в качестве промежуточной.