Умскул учебник стремится стать лучше! Если вы наткнулись на ошибку или неточность в нашем материале - просто сообщите нам, мы будем благодарны!
Информатика

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

13.5.2022
392

На этой странице вы узнаете

  • В каких случаях 10 не равно 10?
  • Как купить шоколадку у инопланетянина?

Привычная нам система счисления называется десятичной, потому что нам с детства удобно считать 10 пальцев на руках. Но так было не всегда: раньше людям было удобнее считать до 12, по количеству фаланг на пальцах одной руки. Для них и для нас число “10” имеет совершенно разное значение.

Виды систем счисления

Система счисления — это модель, которая позволяет записывать числа по определенным правилам.

Основных типов систем счисления две:

  • позиционные,
  • непозиционные.

Непозиционные системы счисления основываются на том, что значение цифр никак не зависит от того, на какой позиции в числе они находятся.

Возьмем фермера и его овец. Какой способ записать количество овец — самый удобный? Самый простой пример — подсчет с помощью одной насечки. Тогда мы подсчитываем овец в своем стаде поштучно, обозначая при записи каждую отдельной засечкой.

Очевидно, что это неудобно. В наших интересах размножать овец. Но чем их больше, тем менее читаема такая запись. Когда мы добьемся невиданных высот в скотоводстве, и у нас станет 2796 голов, их подсчет с помощью одной засечки будет невозможен.

Римская система счисления — еще один известный пример непозиционной системы счисления. В ней уже появляются символы для обозначения отдельных чисел. Но в какой бы позиции символ ни стоял, он все еще значит только самого себя:

  • I — 1;
  • V — 5;
  • X — 10 и так далее.

Римская система счисления упрощает запись чисел, но не решает проблему неудобства чтения полностью. Например, число 2796 в римской записи будет выглядеть как MMDCCXCVI. Уже неприятно.

В позиционных системах счисления значение цифры зависит от того, на какой позиции она стоит. 

На примере нашей родной десятичной системы счисления, мы с вами понимаем, что в числе 1234:

  • 1 — количество тысяч, и обозначает не 1, а 1000;
  • 2 обозначает количество сотен и понимается как 200;
  • 3 отвечает за количество десятков и означает 30;
  • 4 стоит на самой последней позиции и означает количество единиц, поэтому в данном случае 4 — это 4.

Это сильно упрощает чтение чисел любого размера, так как меняется сам принцип их чтения:

  • В непозиционной системе счисления (на примере римской): СХХIII = 100 + 10 + 10 + 1 + 1 + 1 = 123.
  • В позиционной: 123 = 100 + 20 + 3.

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

Основание позиционной системы счисления

Позиционная система счисления характеризуется ее основанием — количеством цифр, которые она использует для записи чисел.

  • Десятичная система счисления (10сс) использует 10 цифр — от 0 до 9, с ней мы знакомы с детства.
  • Компьютеру роднее двоичная система счисления (2сс), которая использует 2 цифры — 1 и 0.
  •  В двенадцатеричной системе счисления (12сс) помимо цифр 0–9 необходимы еще два символа. Для удобства заменим их буквами: A = 10, B = 11. Теперь имеем 12 символов от 0 до B.
  • Также небезызвестная система счисления — шестнадцатеричная. Для нее кроме цифр 0–9 нужно еще больше символов, чтобы обозначить все цифры. Происходит это по аналогии — каждая новая буква отвечает за большее значение: A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.
В каких случаях 10 не равно 10?

Мы используем числа тогда, когда кончаются цифры. Привычная нам система счисления называется десятичной, потому что использует 10 цифр — от 0 до 9. Для записи значений больше 9, мы начинаем строить числа из цифр. Первое такое число — 10.

Если бы мы использовали другое количество цифр, всё выглядело бы иначе. При использовании цифр от 0 до 6, нам пришлось бы строить числа уже для записи значений, больше 6. В таком случае 10 будет равно 7, но эти значения будут записаны в разных системах счисления.

Построение числа в непривычных нам системах счисления происходит точно так же, как и в 10сс:

  1. Увеличиваем значения единиц, используя доступные цифры.
  2. Как только цифры закончились, значение единиц обнуляется. Появляется новый разряд десятков, который также увеличивается от 1 до предела системы счисления.
  3. Когда любой разряд числа принимает значение максимальной цифры — разряд выше увеличивается на 1, а текущий разряд обнуляется.

Например:

  • В 10сс число 88 будет увеличиваться так: 

88 → 89 → 90 → 91 → 92 → … 99 → 100;

  • В 2сс разряды будут появляться быстрее из-за маленького количества цифр: 

1 → 10 → 11 → 100 → 101 → 110 → 111 → 1000;

  • В 12сс чуть медленнее, так как цифр больше: 

8 → 9 → A → B → 10 → 11 → … 18 → 19 → 1A → 1B → 20 → … 99 → 9A → 9B → A0 → A1 → … AA → AB → B0 → B1 → … BA → BB → 100.

Арифметика, как и построение числа, во всех системах счисления одинакова:

  • Изменение разрядов происходит с единиц.
  • При сложении избыток суммы увеличивает разряд выше (то самое “6 пишем, 1 в уме”).
  • В вычитании при необходимости занимаем значение из старшего разряда, уменьшая его на 1.

Расширенная запись числа и перевод из Nсс в 10сс

Как купить шоколадку у инопланетянина?

Уметь переводить числа из 10сс в другие и обратно важно для того, чтобы торговать с инопланетянами.
Однажды мы, вероятно, достучимся до внеземных цивилизаций. Но у них может оказаться не 10 пальцев на руках, а 7, 12 или любое другое количество. Если их представления о математике шли путем, подобному нашему, какую систему счисления придумали они?
Когда мы захотим купить инопланетный сникерс за 2256 межгалактических юнитов, вполне может оказаться, что наши представления о числах сильно отличаются.

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

Полная запись числа a1a2a3…ai, где ai — цифра числа под номером i, состоящей из k символов и с основанием системы счисления n, будет выглядеть как:

a1a2a3…ai…ak = a1 * nk — 1 + a2 * nk — 2 + … + ai * nk — i + … + ak * n0.

На примерах:

  • 123 в 10сс расписывается как: 1 * 102 + 2 * 101 + 3 * 100;
  • 1010 в 2сс: 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20;
  • A9B в 12сс:  10 * 122 + 9 * 121 + 11 * 120.

Такой записи числа достаточно, чтобы перевести значение числа из любой системы счисления в 10сс — нужно посчитать значение составленной записи:

  • 10102 = 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 8 + 0 +2 + 0 = 1010;
  • 5259 = 5 * 92 + 2 * 91 + 5 * 90 = 5 * 81 + 2 * 9 + 5 * 1 = 42810;
  • A9B12 = 10 * 122 + 9 * 121 + 11 * 120 = 10 * 144 + 9 * 12 + 11 * 1 = 155910.

Перевод из 10сс в Ncc

Принцип деления с остатком поможет переводить числа в другую сторону — из 10сс в любую другую систему счисления.

Алгоритм перевода следующий:

  1. Делим исходное число на основание новой системы счисления.
  2. Остаток от деления — новая найденная цифра числа.
  3. Целую часть от деления снова делим на основание. Записываем остаток как новую цифру искомой записи, а целую часть от деления — как цель следующего деления. Снова делим целую часть на основание.
  4. Деление происходит до тех пор, пока целая часть от деления не станет равна 0.
  5. Полученные в качестве остатков от деления цифры нового числа читаются в обратном порядке.

Для примера давайте переведем число 2589 в 7сс:

  1. На первом шаге делим исходное число на 7, записывая остаток от деления как новую цифру и целую часть как оставшееся значение.
  1. На втором шаге делаем то же самое, но с целой частью предыдущего деления — теперь делим ее на 7.
  1. И так до тех пор, пока целая часть от деления не будет равна 0.

Интересующее нас значение находится в самом правом столбце и читается снизу вверх.

258910 = 103567

Перевод в системы счисления с основанием, больше 10, происходит так же. Просто надо не забывать, что цифры больше 9, будут обозначаться соответствующими буквами.

Например, таблица перевода десятичного числа 48406 в 16сс будет выглядеть следующим образом:

И искомое значение будет BD16.

Лайфхак

Между 2сс и системами счисления, в основании которых стоит степень двойки (4сс, 8сс, 16сс), есть связь, которую можно использовать для быстрого перевода из 2сс в них и обратно. Для этого используется следующая таблица:

Алгоритм перевода состоит в следующем:

  1. Вычисляется степень, в которую нужно возвести 2, чтобы получить основание необходимой системы счисления.
  2. Используется количество столбцов таблицы, равное этой степени. Отсчет ведем с правого столбца.
  3. При переводе из 2сс весь код разбивается на кодовые слова длиной, равной степени — при необходимости в начало записи добавляются нули. Отдельные кодовые слова подставляются в нижнюю строку таблицы. Цифра записи числа в новой системе счисления будет равна сумме цифр верхней строки, под которыми стоит 1 кодового слова.
  4. При переводе в 2сс каждая цифра представляется как сумма цифр верхней строки таблицы. Цифрам, которые используются в сумме, соответствуют 1 кодового слова 2сс, а не использующимся — 0.

На примере:

  • Для перевода между 2сс и 4сс используется часть таблицы:
  • Перевод из 2сс в 4сс:
    110001 = 11.00.01 = (2 + 1).(0 + 0).(0 + 1) = 3.0.1 = 301
  • Перевод из 4сс в 2сс:
    103 = 1.0.3 = (0 + 1).(0 + 0).(2 + 1) = 01.00.11 = 10011
  • Для перевода между 2сс и 8сс используется часть таблицы:
  • Перевод из 2сс в 8сс:
    10101011100 = 010.101.011.100 = (0 + 2 + 0).(4 + 0 + 1).(0 + 2 + 1).(4 + 0 + 0) = 2.5.3.4 = 2534
  • Перевод из 8сс в 2сс:
    1753 = 1.7.5.3 = (0 + 0 + 1).(4 + 2 + 1).(4 + 0 + 1).(0 + 2 + 1) = 001.111.101.011 = 1111101011
  • Для перевода между 2сс и 16сс используется вся таблица:
  • Перевод из 2сс в 16сс:
    101101111000001 = 0101.1011.1100.0001 = (0 + 4 + 0 + 1).(8 + 0 + 2 + 1).(8 + 4 + 0 + 0).(0 + 0 + 0 + 1) = 5.11.12.1 = 5BC1
  • Перевод из 16сс в 2сс:
    F87A = 15.8.7.10 = (8 + 4 + 2 + 1).(8 + 0 + 0 + 0).(0 + 4 + 2 + 1).(8 + 0 + 2 + 0) = 1111.1000.0111.1010 = 1111100001111010

Перевод между системами счисления на Python

Перевод больших чисел между системами счисления вручную неудобен и может занимать много времени. Иногда выгоднее было бы написать программу.

Перевод из 10сс в другие будем выполнять по описанному выше алгоритму. Пока исходное число больше 0, делим его на основание системы счисления. Записываем остаток от деления как новую цифру числа. Искомое число — остатки от деления, записанные в обратном порядке.

  1. Основным циклом программы будет while, который работает, пока исходное число больше 0.
  2. Новую цифру числа берем как остаток от деления исходного числа на основание новой системы счисления с помощью оператора %. Новые цифры будем записывать в новую строку, в которой и будет храниться искомая запись. Чтобы не переворачивать число в конце, можем сразу заносить каждую новую цифру не в конец, а в начало строки.
  3. Уменьшаем само число, деля его нацело на основание с помощью оператора //.

Например, перевод числа 258936 в 5сс.


number = 258936
n = 5
new_number = ""

while number > 0:
	d = number % n
	new_number = str(d) + new_number
	number //= n

print(new_number)

Вывод: 31241221

Перевод в 10сс из других систем счисления будем производить по описанной выше формуле:

a1a2a3…ai…ak = a1 * nk — 1 + a2 * nk — 2 + … + ai * nk — i + … + ak * n0.

  1. Главный цикл программы — for. Он будет перебирать цифры исходного числа, а точнее, их индексы, с помощью диапазона range по длине исходного числа.
  2. На каждом шаге цикла цифру ai числа будем умножать на основание системы счисления этого числа n в степени, равной разности длины числа k и порядкового номера текущей цифры i — ai*nk — i . Не забываем, что индексация строки начинается с 0, а не с 1, поэтому порядковый номер цифры — на 1 больше ее индекса.

Например, переведем число 31241221 из 5сс обратно в 10сс.


number = "31241221"
n = 5
new_number = 0
k = len(number)

for i in range(k):
	new_number += int(number[i]) * n ** (k - i - 1)

print(new_number)

Вывод: 258936

Лайфхаки по переводу между системами счисления программой:

  • для перевода числа из 10сс в 2сс, 8сс и 16сс есть встроенные команды: bin, oct и hex соответственно
    • bin(123) — “0b1111011”
    • oct(123) — “0o173”
    • hex(123) — “0x7b”

Важно заметить, что первые два символа в записи числа окажутся лишними в нашем случае — они будут обозначать идентификатор системы счисления, в которую мы перевели число.

Чтобы сразу от него избавиться, при переводе можно использовать срез, который будет учитывать все число без этого идентификатора:

  • bin(123)[2:] — “1111011”
  • oct(123)[2:] — “173”
  • hex(123)[2:] — “7b”
  • перевести число из любой системы счисления в 10сс можно с помощью команды int. Ей необходимо передать два параметра: исходное число в виде строки и основание его системы счисления:
    • int(«31241221», 5) — 258936
    • int(«7b», 16) — 123

Фактчек

  • В позиционных системах счисления, в отличие от непозиционных, значение цифры зависит от ее положения в числе.
  • Основание позиционной системы счисления определяет количество используемых в ней цифр для записи чисел.
  • Для перевода из 10сс в любую другую: берем остаток от деления на основание новой системы счисления в качестве цифр нового числа и записываем их в обратном порядке.
  • Для перевода из любой системы счисления в 10сс: умножаем каждую цифру числа на основание его системы счисления, возведенную в степень разности длины числа и порядкового номера данной цифры.

Проверь себя

Задание 1.
Какая цифра не может использоваться в 8сс?

  1. 0
  2. 3
  3. 7
  4. 8

Задание 2.
Для записи цифр 10-15 в 16сс используются …

  1. буквы A-F
  2. буквы А-Д
  3. буквы U-Z
  4. любые символы по договоренности

Задание 3.
Десятичное число 101 в 2сс будет выглядеть как…

  1. 101
  2. 101101
  3. 1100101
  4. 1010011

Задание 4.
Шестнадцатеричное число FBA000 в 10сс будет выглядеть как …

  1. 16490496
  2. 69409461
  3. 61400900
  4. Это некорректная запись числа в 16сс

Задание 5.
Что сделает запись на языке Python — int(“777”, 8)?

  1. Переведет число 777 из 10сс в 8сс
  2. Переведет число 8 из 10сс в 777сс
  3. Переведет число 777 из 8сс в 10сс

Ответы: 1. — 4; 2. — 1; 3. — 3; 4. — 1; 5. — 3.

Понравилась статья? Оцени:
Читайте также:

Читать статьи — хорошо, а готовиться к экзаменам
в самой крупной онлайн-школе — еще эффективнее.

50 000
Количество
учеников
1510
Количество
стобальников
>15000
Сдали на 90+
баллов