Понятие системы счисления
Что такое система счисления: позиционные и непозиционные системы, основание, разряды и степени — с примерами разложения чисел и Python-расчётами.
Система счисления — набор символов (цифр) и правил, по которым они объединяются в числа. Главный параметр системы — её основание: количество различных цифр.
Позиционные и непозиционные системы
В непозиционных системах значение символа не зависит от его места в записи. Самый известный пример — римская система.
Запись | Значение | Правило |
III | 3 | I + I + I |
IV | 4 | V − I (меньший перед большим = вычитание) |
IX | 9 | X − I |
XLII | 42 | 50 − 10 + 2 |
Арифметика с римскими числами крайне неудобна. Именно поэтому человечество перешло к позиционным системам, где значение цифры определяется её позицией (разрядом).
Разряды и степени основания
В позиционной системе с основанием N позиции нумеруются справа налево, начиная с нуля. Значение числа — сумма произведений каждой цифры на N в степени её позиции.
# Разложить десятичное число 5 309 по разрядам
n = 5309
digits = [int(d) for d in str(n)] # [5, 3, 0, 9]
base = 10
result = 0
print(f"Разложение {n}:")
for i, d in enumerate(reversed(digits)):
term = d * (base ** i)
result += term
print(f" {d} × {base}^{i} = {term}")
print("Сумма:", result)
Вывод:
Разложение 5309: 9 × 10^0 = 9 0 × 10^1 = 0 3 × 10^2 = 300 5 × 10^3 = 5000 Сумма: 5309
То же самое в двоичной системе
Основание 2, цифры только 0 и 1. Разложим двоичное число 1101₂:
binary_digits = [1, 1, 0, 1] # 1101₂, старший бит слева
base = 2
result = 0
print("Разложение 1101₂:")
for i, d in enumerate(reversed(binary_digits)):
term = d * (base ** i)
result += term
print(f" {d} × 2^{i} = {term}")
print("Десятичное значение:", result)
Вывод:
Разложение 1101₂: 1 × 2^0 = 1 0 × 2^1 = 0 1 × 2^2 = 4 1 × 2^3 = 8 Десятичное значение: 13
1101₂ = 13₁₀.
Шестнадцатеричная: буквы как цифры
Основание 16 требует 16 символов. Цифры 0–9 дополняются буквами A–F (10–15).
Символ | A | B | C | D | E | F |
Значение | 10 | 11 | 12 | 13 | 14 | 15 |
# Разложить шестнадцатеричное число 2F по разрядам
# 2F₁₆ = 2 × 16¹ + 15 × 16⁰
hex_digits = [2, 15] # '2' и 'F'=15
base = 16
result = 0
print("Разложение 2F₁₆:")
for i, d in enumerate(reversed(hex_digits)):
term = d * (base ** i)
result += term
print(f" {d} × 16^{i} = {term}")
print("Десятичное значение:", result)
Вывод:
Разложение 2F₁₆: 15 × 16^0 = 15 2 × 16^1 = 32 Десятичное значение: 47
Универсальная функция перевода
def from_base(digits_str, base):
"""Перевести число из любой системы с основанием base в десятичную."""
digits_str = digits_str.upper()
result = 0
for ch in digits_str:
value = int(ch, 16) if ch.isalpha() else int(ch)
result = result * base + value
return result
print(from_base("101010", 2)) # 42
print(from_base("52", 8)) # 42
print(from_base("2A", 16)) # 42
Вывод:
42 42 42
Коротко
- Система счисления задаётся основанием — количеством различных цифр.
- В позиционной системе ценность цифры зависит от её разряда (степени основания).
- Непозиционные системы (римская) неудобны для вычислений — позиционные победили.
- Шестнадцатеричная система использует буквы A–F как цифры 10–15.
- Любое число переводится в десятичную через сумму: цифра × основание^позиция.