Как переводить числа между системами счисления
Чтобы перевести число из десятичной системы в любую другую (двоичную, восьмеричную, шестнадцатеричную), нужно последовательно делить исходное число на основание новой системы и записывать остатки в обратном порядке. Для обратного перевода (из любой системы в десятичную) каждую цифру умножают на основание в степени её разряда и суммируют результаты. Эти два алгоритма являются базовыми для работы с данными в программировании и электронике.
Основные системы счисления
В информатике чаще всего используются четыре системы счисления. Их отличие заключается в основании — количестве уникальных цифр, используемых для записи чисел.
- Десятичная (Decimal): Основание 10. Цифры: 0–9. Привычна для человека.
- Двоичная (Binary): Основание 2. Цифры: 0, 1. Язык машинного кода.
- Восьмеричная (Octal): Основание 8. Цифры: 0–7. Используется редко, иногда в правах доступа в Linux.
- Шестнадцатеричная (Hexadecimal): Основание 16. Цифры: 0–9 и буквы A–F (где A=10, ..., F=15). Удобна для компактной записи байтов.
В шестнадцатеричной системе буквы обозначают числа от 10 до 15. Всегда используйте заглавные буквы (A-F) для избежания путаницы, особенно в коде.
Перевод из десятичной системы в другие (Метод деления)
Этот универсальный алгоритм позволяет получить запись числа в любой системе с основанием $B$.
Алгоритм:
- Разделите десятичное число на основание целевой системы ($B$).
- Запишите остаток от деления (это младший разряд).
- Возьмите полученное частное и повторите деление на $B$.
- Продолжайте процесс, пока частное не станет равным 0.
- Выпишите все остатки справа налево (от последнего к первому).
Пример: Перевод 156₁₀ в двоичную систему (B=2)
| Деление | Частное | Остаток (цифра) |
|---|---|---|
| 156 ÷ 2 | 78 | 0 |
| 78 ÷ 2 | 39 | 0 |
| 39 ÷ 2 | 19 | 1 |
| 19 ÷ 2 | 9 | 1 |
| 9 ÷ 2 | 4 | 1 |
| 4 ÷ 2 | 2 | 0 |
| 2 ÷ 2 | 1 | 0 |
| 1 ÷ 2 | 0 | 1 |
Читаем остатки снизу вверх: 10011100₂.
Пример: Перевод 156₁₀ в шестнадцатеричную (B=16)
- $156 \div 16 = 9$, остаток 12 (в hex это буква C).
- $9 \div 16 = 0$, остаток 9.
Результат (снизу вверх): 9C₁₆.
Самая частая ошибка — записать остатки в порядке их получения (слева направо). Всегда начинайте чтение результата с последнего остатка.
Перевод из любой системы в десятичную (Метод степеней)
Чтобы понять, чему равно число в другой системе, нужно развернуть его по степеням основания. Формула для числа $d_n...d_1d_0$ в системе с основанием $B$:
$$N = d_n \cdot B^n + ... + d_1 \cdot B^1 + d_0 \cdot B^0$$
Где $d$ — цифра разряда, а степень $B$ зависит от позиции цифры (счет начинается с 0 справа).
Пример: 10011100₂ → десятичная Разряды справа налево имеют степени $2^0, 2^1, ..., 2^7$. $$1\cdot2^7 + 0\cdot2^6 + 0\cdot2^5 + 1\cdot2^4 + 1\cdot2^3 + 1\cdot2^2 + 0\cdot2^1 + 0\cdot2^0$$ $$= 128 + 0 + 0 + 16 + 8 + 4 + 0 + 0 = \mathbf{156}_{10}$$
Пример: 9C₁₆ → десятичная Здесь $C = 12$. $$9\cdot16^1 + 12\cdot16^0 = 144 + 12 = \mathbf{156}_{10}$$
Быстрый перевод между двоичной и шестнадцатеричной системами
Поскольку $16 = 2^4$, перевод между этими системами выполняется мгновенно через группировку битов. Не нужно использовать деление или умножение.
- Binary → Hex: Разбейте двоичное число на группы по 4 бита (тетрады), двигаясь справа налево. Замените каждую тетраду соответствующей hex-цифрой.
- Hex → Binary: Замените каждую шестнадцатеричную цифру на соответствующие ей 4 бита.
Таблица соответствия тетрад
| Двоичное | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
|---|---|---|---|---|---|---|---|---|
| Hex | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Двоичное | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
| Hex | 8 | 9 | A | B | C | D | E | F |
Пример: Перевести 10011100₂ в hex.
- Делим на тетрады:
1001и1100. - Смотрим в таблицу:
1001= 9,1100= C. - Результат: 9C.
Аналогично работает перевод в восьмеричную систему, но группы составляются по 3 бита.
Работа с дробными числами
Для перевода дробной части десятичного числа используется метод умножения.
Алгоритм (десятичная → другая):
- Умножьте дробную часть на основание новой системы ($B$).
- Целая часть произведения — это следующая цифра после запятой.
- Возьмите дробную часть результата и повторите умножение.
- Повторяйте, пока дробная часть не станет 0 или не будет достигнута нужная точность.
Пример: 0.625₁₀ → двоичная
- $0.625 \times 2 = \mathbf{1}.25$ (цифра 1)
- $0.25 \times 2 = \mathbf{0}.5$ (цифра 0)
- $0.5 \times 2 = \mathbf{1}.0$ (цифра 1)
- Дробная часть стала 0. Стоп.
Результат: 0.101₂.
Не все десятичные дроби точно переводятся в двоичные. Например, 0.1₁₀ в двоичной системе является бесконечной периодической дробью (0.000110011...). Это причина ошибок округления в финансовых вычислениях на компьютерах.
Частые ошибки
- Путаница порядка битов: При переводе из десятичной системы остатки записываются в обратном порядке (последний остаток — старший разряд). При обратном переводе степени возрастают справа налево.
- Игнорирование букв в Hex: Забывают, что после 9 идет A (10), а не 10 как две цифры. В одной ячейке может стоять только один символ.
- Неверная группировка: При быстром переводе binary-hex начинают группировать биты слева направо. Группировать нужно строго справа налево от младшего разряда. Если битов не хватает до полной четверки/тройки слева, число дополняют нулями (например,
101превращается в0101).
FAQ
Как быстро перевести число в коде? В большинстве языков есть встроенные функции.
- Python:
bin(156)→'0b10011100',hex(156)→'0x9c',int('10011100', 2)→156. - JavaScript:
(156).toString(2),parseInt('10011100', 2). - Калькулятор Windows: Переключите режим в «Программист» (Programmer), введите число и выберите нужную систему (Bin, Oct, Dec, Hex).
Зачем нужны восьмеричная и шестнадцатеричная системы? Двоичная запись слишком длинная для человека (байт — это 8 символов). Шестнадцатеричная запись сжимает байт до двух символов, что удобно для чтения цветов (HTML/CSS), адресов памяти и машинных кодов. Восьмеричная исторически использовалась в архитектурах, где байт был не 8, а иначе кратен 3 битам, сейчас встречается реже.
Что такое дополнительный код?
Для представления отрицательных чисел в компьютере используется специальный формат (дополнительный код). Чтобы получить -5 в 8-битном формате: берут 5 (00000101), инвертируют все биты (11111010) и прибавляют единицу (11111011). Прямой перевод знака минус в двоичную систему простым добавлением символа "-" в вычислительной технике не применяется.