Перевод десятичного числа в любую систему счисления
Написать программу, которая переводит десятичное число в любую другую систему счисления. Число и основание новой системы счисления вводятся с клавиатуры. При желании реализовать в программе функцию такого преобразования.
Решение задачи на языке программирования Python
Алгоритм перевода десятичного числа в любую другую систему счисления заключается в последовательном целочисленном делении сначала самого десятичного числа, а потом получаемых частных на основание системы счисления, в которую переводится число. Из остатков такого деления собирается представление числа в новой системе счисления. В той, на основание которой происходило деление. Сбор остатков происходит с конца.
Например, перевод десятичных чисел 160 в восьмеричную и 18 в двоичную системы счисления будет выглядеть так:
160 / 8 = 20 | 0 20 / 8 = 2 | 4 2 / 8 = 0 | 2
16010 = 2408
18 / 2 = 9 | 0 9 / 2 = 4 | 1 4 / 2 = 2 | 0 2 / 2 = 1 | 0 1 / 2 = 0 | 1
1810 = 100102
Даже если использовать этот алгоритм для перевода десятичного числа в десятичную систему счисления будет получен верный результат.
150 // 10 = 15 | 0 15 // 10 = 1 | 5 1 // 10 = 0 | 1
15010 = 15010
Проблема появляется в тот момент, когда основание системы счисления начинает превышать 10. В таких случаях нам не хватает привычных символов цифр (0-9) и требуется ввод дополнительных символов для обозначения значений, соответствующих десятичным числам 10, 11, 12 и т. д. Для примера переведем десятичное число в шестнадцатеричную систему счисления:
700 // 16 = 43 | 12 (C) 43 // 16 = 2 | 11 (B) 2 // 16 = 0 | 2
70010 = 2BC16
Десятичные остатки 12 и 11 при формировании шестнадцатеричного числа должны быть представлены одним разрядом. В таких случаях в качестве цифр, чье значение больше 9-ти, используются английские буквы. Так числу 10 будет соответствовать символ A , числу 11 — B и т. д.
Таким образом, при написании программы перевода десятичного числа в любую систему счисления мы должны предусмотреть подмену остатков на соответствующие им символы, если эта замена требуется.
Будем усложнять программу поэтапно и сначала напишем вариант кода, который переводит не в любую систему счисления, а только с основанием до 10-ти.
num = int(input()) base = 0 while not (2 base 9): base = int(input("Основание (2-9): ")) new = '' while num > 0: remainder = num % base new = str(remainder) + new num = num // base print(new)
В цикле сначала вычисляется остаток. Далее присоединям его спереди к строковой переменной new , в которой хранится представление числа в новой системе счисления. Последним действием присваиваем переменной num частное от целочисленного деления прежнего значения num на основание системы счисления.
Поскольку в языке программирования Python есть функция divmod , сократим код, объединив нахождение остатка и целочисленное деление:
. while num > 0: num, remainder = divmod(num, base) new = str(remainder) + new .
Вызов divmod(num, base) возвращает кортеж из частного и остатка от деления num на base . Далее частное присваивается num , остаток — remainder .
Теперь напишем программу, которая переводит число исключительно в шестнадцатеричную систему счисления. Для хранения символов, которыми будут заменяться двузначные остатки, используем строку из этих символов.
num = int(input()) base = 16 letters = 'ABCDEF' new = '' while num > 0: num, remainder = divmod(num, base) if remainder > 9: letter_id = remainder - 10 remainder = letters[letter_id] new = str(remainder) + new print(new)
Числу 10 соответствует символ A . Поэтому если остаток равен десяти, то letter_id будет равно нулю. Символ под индексом 0 в строке букв — как раз A . Если остаток равен 15-ти, то letter_id будет равно пяти, а letters[5] вернет F .
Программу можно упростить, если в строку символов добавить цифры. В этом случае остатки будут точно соответствовать индексам, под которыми находятся соответствующие им символы.
num = int(input()) base = 16 letters = '0123456789ABCDEF' new = '' while num > 0: num, remainder = divmod(num, base) new = letters[remainder] + new print(new)
На этом этапе должно стать понятно, как написать программу конвертации десятичного числа в почти любую систему счисления. Достаточно немного подправить код перевода в шестнадцатеричную систему, дописав в строку дополнительный набор символов, а не заканчивать ее на F .
Чтобы не хранить в программе строку большой длины и избежать ошибки из-за нечаянно пропущенного какого-нибудь символа, вернемся к варианту, в котором остатки больше девяти заменяются в теле условного оператора. При этом буквы будем брать не из определенной в коде строки, а из встроенной таблицы символов.
num = int(input()) base = 0 while not (2 base 36): base = int(input("Основание (2-36): ")) new = '' while num > 0: num, remainder = divmod(num, base) if remainder > 9: letter = remainder - 10 remainder = chr(ord('A') + letter) new = str(remainder) + new print(new)
Вызов ord(‘A’) возвращает код буквы A в таблице Unicode. К этому коду-числу мы прибавляем смещение по алфавиту (значение letter ). С помощью функции chr() получаем соответстующую коду букву.
def convert_integer(decimal, radix): if radix > 36: return "Основание системы счисления должно быть не больше 36-ти" number = '' while decimal > 0: decimal, remainder = divmod(decimal, radix) if remainder > 9: remainder = chr(ord('A') + remainder - 10) number = str(remainder) + number return number num = int(input("Десятичное число: ")) base = int(input("Основание (2-36): ")) print(convert_integer(num, base))
Ограничение по основанию в 36 связано с количеством букв в английском алфавите. Их 26, плюс десять цифр. Расширить диапазон оснований можно за счет взятия недостающих символов из какой-либо другой части таблицы Unicode. Например, можно добавить к условному оператору ветку elif с условием remainder > 35 , а в теле вычитать из remainder 36.
Однако написать программу, которая переводит десятичное число в абсолютно любую систему счисления нельзя. Иначе надо суметь решить задачу генерации случайного символа, который не должен быть похож ни на какой из полученных ранее.
X Скрыть Наверх
Решение задач на Python
Как перевести число из десятичной системы счисления в двоичную в Python
Введение в перевод чисел в различные системы счисления
Числа в компьютерной науке и программировании представляются в различных системах счисления, таких как двоичная, восьмеричная и шестнадцатеричная. Понимание, как переводить числа из одной системы счисления в другую, является важным навыком при работе с программами и алгоритмами.
Перевод чисел из десятичной системы счисления в другие системы является одной из наиболее распространенных операций. В данной статье мы сосредоточимся на переводе чисел из десятичной системы в двоичную систему счисления.
Десятичная система счисления, или основание 10, является наиболее распространенной системой счисления в повседневной жизни. В ней используются цифры от 0 до 9, а каждая позиция числа имеет вес, увеличивающийся в 10 раз с каждой следующей позицией. Например, число 357 в десятичной системе счисления представляет собой 3 * 10 2 + 5 * 10 1 + 7 * 10 0 .
Двоичная система счисления, или основание 2, использует всего две цифры — 0 и 1. Каждая позиция числа в двоичной системе имеет вес, увеличивающийся в 2 раза с каждой следующей позицией. Например, число 101 в двоичной системе счисления представляет собой 1 * 2 2 + 0 * 2 1 + 1 * 2 0 , что равно 5 в десятичной системе.
Перевод чисел из десятичной системы в двоичную систему может быть полезным при работе с битовыми операциями, компьютерными сетями, шифрованием и другими аспектами программирования.
В следующих разделах мы рассмотрим различные методы и алгоритмы перевода чисел из десятичной системы в двоичную систему счисления. Это поможет нам лучше понять процесс перевода и научиться применять его в наших программных проектах.
Основы двоичной системы счисления
Двоичная система счисления является основой для работы с компьютерами, так как вся информация в компьютерах представлена в виде двоичных чисел — наборов из нулей (0) и единиц (1). В данном разделе мы познакомимся с основами двоичной системы и ее структурой.
Двоичная система счисления основана на позиционной системе, где каждая позиция числа имеет определенный вес, увеличивающийся вдвое с каждым следующим разрядом. В двоичной системе счисления используются всего две цифры: 0 и 1.
Позиции чисел в двоичной системе называются разрядами. Начиная с самого правого разряда, позиции имеют веса, соответствующие степеням числа 2. Например, в двоичной системе число «101» можно разложить следующим образом: 1 * 2 2 + 0 * 2 1 + 1 * 2 0 = 4 + 0 + 1 = 5.
Когда мы работаем с двоичными числами, мы можем заметить некоторые особенности. Например, число, оканчивающееся на ноль, всегда будет кратным 2. Каждый разряд числа может быть либо нулем, либо единицей. При увеличении числа на единицу в двоичной системе, мы изменяем только самый правый разряд. Если все разряды числа равны единице и мы добавляем единицу, то получим новое число, состоящее из всех нулей с одной единицей в более старшем разряде. Это называется переполнением.
Понимание основ двоичной системы счисления важно при работе с компьютерами и программированием. Оно помогает нам понять внутреннее представление данных, выполнение битовых операций, работу с памятью и другие аспекты компьютерной науки.
Математический подход к переводу числа из десятичной системы в двоичную
Перевод числа из десятичной системы счисления в двоичную можно выполнить с помощью математического подхода. Этот метод основан на последовательном делении числа на 2 и записи остатков в обратном порядке.
Вот шаги для перевода числа из десятичной системы в двоичную с использованием математического подхода:
- Начните с десятичного числа, которое вы хотите перевести в двоичную систему.
- Разделите это число на 2 и запишите остаток.
- Результат деления становится новым числом, и процесс повторяется до тех пор, пока результат деления не станет равным нулю.
- Запишите остатки от каждого деления в обратном порядке. Это будет двоичное представление исходного числа.
Давайте рассмотрим пример для наглядности. Переведем число 25 из десятичной системы в двоичную:
- Шаг 1: 25 / 2 = 12 с остатком 1
- Шаг 2: 12 / 2 = 6 с остатком 0
- Шаг 3: 6 / 2 = 3 с остатком 0
- Шаг 4: 3 / 2 = 1 с остатком 1
- Шаг 5: 1 / 2 = 0 с остатком 1
Теперь запишем остатки в обратном порядке: 11001. Полученное число 11001 является двоичным представлением числа 25.
В Python можно использовать цикл и операторы деления и остатка для реализации этого математического подхода. Мы также можем использовать строковые операции для записи остатков и получения окончательного двоичного числа.
Математический подход к переводу чисел из десятичной системы в двоичную является фундаментальным и полезным при работе с двоичными данными. Он может быть расширен для перевода чисел в другие системы счисления, такие как восьмеричная или шестнадцатеричная, и помогает понять внутреннее представление чисел в компьютерных системах.
Использование встроенных функций Python для перевода чисел в двоичную систему
Python предоставляет удобные встроенные функции для выполнения преобразований чисел из десятичной системы счисления в двоичную. Эти функции позволяют нам легко и эффективно выполнять перевод без необходимости реализации алгоритма вручную.
Функция bin()
Функция bin() используется для получения двоичного представления числа в виде строки. Она принимает десятичное число в качестве аргумента и возвращает его двоичное представление. Например:
decimal_num = 25 binary_num = bin(decimal_num) print(binary_num) # '0b11001'
Обратите внимание, что результатом будет строка, начинающаяся с префикса ‘0b’, который указывает на двоичное представление.
Метод format()
Метод format() может использоваться для форматирования числа в двоичную систему счисления. Он позволяет задавать формат числа, включая систему счисления. Для перевода числа в двоичную систему счисления мы можем использовать формат ‘b’. Пример использования метода format() для перевода числа в двоичную систему:
decimal_num = 25 binary_num = format(decimal_num, 'b') print(binary_num) # '11001'
Здесь мы передаем десятичное число и формат ‘b’ в качестве аргументов метода format(), что приводит к его представлению в двоичной системе счисления.
Оба этих подхода предоставляют удобные и простые способы перевода чисел из десятичной системы в двоичную в Python. Выбор конкретного метода зависит от ваших предпочтений и требований конкретной задачи.
Ручная реализация алгоритма перевода в двоичную систему в Python
Перевод числа из десятичной системы счисления в двоичную можно выполнить вручную, следуя простому алгоритму. Алгоритм основан на делении числа на 2 и записи остатков в обратном порядке.
- Инициализируйте пустую строку (или список) для записи двоичного представления числа.
- Делите исходное число на 2 и запоминайте остаток от деления.
- Делите полученное частное на 2 и снова запоминайте остаток.
- Продолжайте делить полученные частные на 2 и запоминать остатки до тех пор, пока частное не станет равным 0.
- Запишите все запомненные остатки в обратном порядке — это будет двоичное представление числа.
Пример реализации алгоритма в Python:
decimal_num = 42 binary = "" while decimal_num > 0: remainder = decimal_num % 2 binary = str(remainder) + binary decimal_num = decimal_num // 2 print(binary)
В этом примере мы выполняем перевод числа 42 из десятичной системы в двоичную. Мы инициализируем пустую строку binary для записи двоичного представления числа. Затем мы выполняем деление числа на 2 и запоминаем остаток. Полученный остаток добавляем в начало строки binary . Затем мы делим частное на 2 и повторяем процесс до тех пор, пока частное не станет равным 0. Наконец, мы выводим полученное двоичное представление числа.
Ручная реализация алгоритма позволяет нам лучше понять процесс перевода чисел в двоичную систему и может быть полезна при работе с другими системами счисления или при необходимости настроить алгоритм под специфические требования.
Как в питоне переводить числа из одной системы счисления в другую?
В Python вы можете переводить числа из одной системы счисления в другую с помощью встроенных функций int и str. Чтобы перевести число из одной системы счисления в другую, нужно сначала преобразовать его в десятичную систему счисления с помощью функции int. Затем преобразуйте полученное десятичное число в целевую систему счисления с помощью функции str.
number = "101010" # Число в исходной системе счисления base_from = 2 # Исходная система счисления base_to = 10 # Целевая система счисления decimal_number = int(number, base_from) result = str(decimal_number, base_to) print(result) # Вывод результата
В данном примере мы преобразуем число «101010» из двоичной системы счисления в десятичную. Затем преобразуем полученное десятичное число в целевую систему счисления (в данном случае, в десятичную).
Детальный ответ
Как в питоне переводить из одной системы счисления в другую
Перевод чисел из одной системы счисления в другую является важным навыком, который часто используется в программировании. В питоне есть несколько способов выполнить эту задачу. Давайте рассмотрим некоторые из них.
1. Встроенные функции int() и str()
Первый способ — использовать встроенные функции int() и str(). Функция int() позволяет нам преобразовать строку в число, указывая систему счисления вторым аргументом. Функция str() позволяет преобразовать число обратно в строку с указанной системой счисления. Вот пример кода:
# Пример: Перевод числа из десятичной системы в двоичную dec_num = 10 bin_num = str(bin(dec_num))[2:] print(bin_num) # Пример: Перевод числа из двоичной системы в десятичную bin_num = '1010' dec_num = int(bin_num, 2) print(dec_num)
В этом примере мы используем функцию bin(), чтобы перевести число из десятичной системы в двоичную. Затем мы используем срез [2:] для удаления префикса ‘0b’. Второй пример демонстрирует обратную операцию — перевод числа из двоичной системы в десятичную. В функции int() мы указываем вторым аргументом систему счисления (2 для двоичной).
2. Методы объекта int
Второй способ — использовать некоторые методы объекта int. Методы, такие как bin(), oct() и hex(), позволяют переводить числа в различные системы счисления. Вот пример кода:
# Пример: Перевод числа из десятичной системы в двоичную, восьмеричную и шестнадцатеричную dec_num = 10 bin_num = bin(dec_num) oct_num = oct(dec_num) hex_num = hex(dec_num) print(bin_num) print(oct_num) print(hex_num) # Пример: Перевод числа из шестнадцатеричной системы в десятичную hex_num = 'A' dec_num = int(hex_num, 16) print(dec_num)
В этом примере мы используем методы bin(), oct() и hex(), чтобы перевести число из десятичной системы в двоичную, восьмеричную и шестнадцатеричную соответственно. Во втором примере мы используем функцию int() для перевода числа из шестнадцатеричной системы в десятичную.
3. Ручной перевод
Третий способ — выполнить ручной перевод числа из одной системы счисления в другую. Это является наиболее гибким подходом, но требует больше кода для реализации. Вот пример кода:
# Пример: Перевод числа из десятичной системы в двоичную dec_num = 10 bin_num = '' while dec_num > 0: bin_num = str(dec_num % 2) + bin_num dec_num = dec_num // 2 print(bin_num)
В этом примере мы используем цикл while для получения остатков от деления числа на 2 и добавления их в начало строки bin_num. Затем мы делим число на 2, чтобы перейти к следующей цифре двоичного представления. Процесс продолжается, пока число не станет равным 0.
Заключение
Теперь у вас есть несколько способов выполнить перевод чисел из одной системы счисления в другую с помощью питона. Вы можете выбрать тот, который наиболее подходит для вашей задачи. Используйте приведенные примеры кода в своих проектах и практикуйтесь для лучшего понимания.
Перевод чисел из одной системы счисления в другую
Описание функций для перевода целых чисел в Python из одной системы счисления в другую можно посмотреть в нашем учебнике здесь. В статье же рассматривается общая математическая теория для более глубокого понимания вопроса и расширения кругозора.
Калькулятор перевода чисел между СС
Инструкция калькулятора
Назначение
Калькулятор (конвертер) служит для перевода неотрицательных целых и дробных действительных чисел длиной не более 200 символов из одной системы счисления в другую.
Поддерживаются системы счисления с основаниями от 2 до 36 .
При переводе дробных чисел из одной системы счисления в другую может теряться точность. В таких случаях калькулятор конвертирует число, отображая в результате только 100 знаков после запятой.
Перевод целых чисел
Перевести целое число 2547 из 10 -й системы счисления в 16 -ю.
Заполняем поля:
Исходная СС — 10
Переводим число — 2547
В систему счисления — 16
Жмем кнопку «Перевести» , получаем результат: 9F3 .
Чтобы скопировать результат в буфер обмена, жмем кнопку «Копировать» .
Перевод дробных чисел
Перевести дробное число 25.753 из 8 -й системы счисления в 16 -ю.
Заполняем поля:
Исходная СС — 8
Переводим число — 25.753
В систему счисления — 16
Жмем кнопку «Перевести» , получаем результат: 15.F58 .
Чтобы скопировать результат в буфер обмена, жмем кнопку «Копировать» .
Вступление к теории
В повседневной жизни мы привыкли иметь дело с десятичной системой счисления, в которой числа образуются при помощи цифр 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 . Однако современные компьютеры на аппаратном уровне работают только с цифровыми данными представленными в двоичной системе счисления, в которой числа образуются при помощи двух цифр 0 и 1 . Это связано с тем, что компьютеры для обработки информации используют устройства, которые могут принимать только два различных устойчивых состояния, например, заряжен или не заряжен, намагничен или не намагничен, есть ток или нет тока и т.д. Одно из состояний устройства принимается за ноль, а другое – за единицу. После объединения множества таких простейших устройств в одно сложное, например, процессор, как раз и появляется возможность обрабатывать данные в виде чисел в двоичной системе счисления. Но поскольку двоичные числа очень длинные, то для более короткой и удобной их записи при составлении программ на языке машинных кодов используются промежуточные восьмеричная и шестнадцатеричная системы счисления, числа в которых образуются, соответственно, при помощи цифр 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 и 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , A , B , C , D , E , F . Все это приводит к тому, что в ходе написания программ время от времени появляется необходимость перевода чисел из одной системы счисления в другую. Рассмотрением данного вопроса мы как раз и займемся в данной статье.
Перевод целых чисел и правильных дробей из десятичной системы
счисления в систему счисления с основанием «n»
Сразу же отметим, что перевод целых чисел и правильных дробей производится по разным правилам. Поэтому для вещественного числа, которое имеет целую и дробную части, для перевода целой части применяется правило перевода целых чисел, а для перевода дробной части – правило перевода правильных дробей. Рассмотрим все случаи по отдельности.
1. Для перевода целых чисел из десятичной системы счисления в систему счисления с основанием «n» используется следующий алгоритм.
- Исходное десятичное число a делится нацело на основание n , в результате чего получается частное c_1 и остаток от деления r_1 , который фиксируется.
- Далее, частное c_1 вновь делится на основание n , остаток r_2 фиксируется, а вся процедура повторяется заново до тех пор, пока частное не станет равным нулю (частное, а не остаток!).
- В самом конце из полученных остатков, записанных в порядке, обратном их получению, составляется требуемое число в новой системе счисления с основанием «n» .
В качестве примера рассмотрим перевод числа 35 из десятичной системы счисления в двоичную, восьмеричную и шестнадцатеричную:
35:2 = 17 (остаток 1) //фиксируем 1 17:2 = 8 (остаток 1) //фиксируем 1 8:2 = 4 (остаток 0) //фиксируем 0 4:2 = 2 (остаток 0) //фиксируем 0 2:2 = 1 (остаток 0) //фиксируем 0 1:2 = 0 (остаток 1) //фиксируем 1 -------------------------------- Результат: 3510 = 1000112.
35:8 = 4 (остаток 3) //фиксируем 3 4:8 = 0 (остаток 4) //фиксируем 4 -------------------------------- Результат: 3510 = 438.
35:16 = 2 (остаток 3) //фиксируем 3 2:16 = 0 (остаток 2) //фиксируем 2 -------------------------------- Результат: 3510 = 2316.
2. Для перевода правильных дробей из десятичной системы счисления в систему счисления с основанием «n» алгоритм имеет другой вид.
- Исходное десятичное число a , модуль которого меньше единицы ( |a| ), умножается на основание n , после чего целая часть результата произведения фиксируется.
- Далее, дробная часть результата вновь умножается на основание n , целая часть нового результата фиксируется, а вся процедура повторяется заново до тех пор, пока дробная часть очередного результата не станет равной нулю либо не будет достигнута требуемая точность числа в новой системе счисления с основанием n .
- В самом конце составляется требуемое число в новой системе счисления. Для этого записывается нулевая целая часть числа, а затем из зафиксированных ранее целых частей, при чем в той последовательности, в которой они были получены, составляется его дробная часть.
Отметим, что целые числа могут быть точно переведены из одной системы счисления в другую, чего не скажешь о дробных числах, которые в общем случае не могут быть переведены без потери точности. Поэтому очень важно при переводе дробных чисел уметь правильно определять в конечном числе количество разрядов после запятой, которые обеспечат нам требуемую точность. Добиться этого можно исходя из того, что число будет иметь одинаковую точность в различных системах счисления, если веса младших разрядов числа в этих системах будут одинаковы.
Вес P младшего разряда числа в текущей системе счисления, т.е. точность, которую обеспечивает данный разряд, определяется по формуле P = 1/(n k ) , где n — основание системы счисления, k — количество разрядов после запятой. Следовательно, для двух систем счисления равенство весов будет иметь вид: 1/(n_1 k_1 ) = 1/(n_2 k_2 ) , откуда требуемое минимальное количество разрядов числа после перевода будет равно k_2 = k_1/(logn_1n_2) . Например, вес младшего разряда числа 0.6 в десятичной системе счисления будет равен 1/(10 1 ) = 0.1 . Поэтому в случае перевода его, например, в двоичную систему счисления с точностью до сотых в исходной системе, количество разрядов конечного числа должно быть не менее 7 , т.к. 2/(log102) ≈ 2/0.3 ≈ 6.6 . Таким образом при обратном переводе мы получим исходное число с точностью до одной сотой.
Заметим, что если при переводе числа из десятичной в требуемую систему счисления, получается бесконечная дробь (периодическая или непериодическая), то в общем случае нам придется мириться с потерей точности числа, отсекая лишние разряды. Следовательно, целевое число будем меньше исходного.
Рассмотрим в качестве примера перевод числа 0.3 из десятичной системы счисления в двоичную, восьмеричную и шестнадцатеричную.
Требуемое количество разрядов k2 = 7, т.к. 2/log102 ≈ 6.6. 0.3*2 = 0.6 (целая часть рез-та равна 0) //фиксируем 0 0.6*2 = 1.2 (целая часть рез-та равна 1) //фиксируем 1 0.2*2 = 0.4 (целая часть рез-та равна 0) //фиксируем 0 0.4*2 = 0.8 (целая часть рез-та равна 0) //фиксируем 0 0.8*2 = 1.6 (целая часть рез-та равна 1) //фиксируем 1 0.6*2 = 1.2 (целая часть рез-та равна 1) //фиксируем 1 0.2*2 = 0.4 (целая часть рез-та равна 0) //фиксируем 0 -------------------------------- Результат: 0.310 = 0.01001102. Обратный перевод: 0.01001102 = 0.29687510 (ε ≤ 0.01).
Требуемое количество разрядов k8 = 3, т.к. 2/log108 ≈ 2.2. 0.3*8 = 2.4 (целая часть рез-та равна 2) //фиксируем 2 0.4*8 = 3.2 (целая часть рез-та равна 3) //фиксируем 3 0.2*8 = 1.6 (целая часть рез-та равна 1) //фиксируем 1 -------------------------------- Результат: 0.310 = 0.2318. Обратный перевод: 0.2318 = 0.29882812510 (ε ≤ 0.01).
Требуемое количество разрядов k16 = 2, т.к. 2/log1016 ≈ 1.66. 0.3*16 = 4.8 (целая часть рез-та равна 4) //фиксируем 4 0.8*16 = 12.8 (целая часть рез-та равна 1210 = C16) //фиксируем C -------------------------------- Результат: 0.310 = 0.4C16. Обратный перевод: 0.4C16 = 0.29687510 (ε ≤ 0.01).
3. В общем случае для перевода вещественных чисел из десятичной системы счисления в систему счисления с основанием «n» следует отдельно перевести его целую и дробную части, а затем дописать дробную часть к целой. Например, для числа 35.310 получим:
35.310 = 1000112 + 0.01001102 = 100011.01001102; 35.310 = 438 + 0.2318 = 43.2318; 35.310 = 2316 + 0.4C16 = 23.4C16.
4. Из всего выше сказанного следует, что перевод числа из системы счисления с основанием «n» в систему счисления с основанием «m» можно осуществить в два этапа:
- в начале переводим число в десятичную систему счисления;
- а затем в нужную нам систему счисления с основанием «m» .
При этом не нужно забывать, что в общем случае при переводе дробных чисел из одной системы счисления в другую теряется точность.
Перевод чисел из системы счисления с основанием «n»
в десятичную систему счисления
Начнем с того, что в общем случае число c в позиционной системе счисления может быть разложено по степеням своего основания «n» и представлено в виде полинома в десятичной системе счисления:
c = ma-1*n a-1 + ma-2*n a-2 + . + m1*n 1 + m0*n 0 + m-1*n -1 + . + m-b*n -b , где
n – основание исходной системы счисления;
a – количество разрядов целой части в исходном числе;
b – количество разрядов дробной части в исходном числе;
mi – значение цифры в i -ом разряде исходного числа, где i изменяется от a-1 до -b .
Таким образом, для перевода числа из системы счисления с основанием «n» в десятичную систему счисления нужно представить его в виде данного полинома, а затем вычислить получившуюся сумму.
В качестве примеров переведем числа наших примеров обратно в десятичную систему счисления.
100011.01001102 = 1*25 + 0*24 + 0*23 + 0*22 + 1*21 + + 1*20 + 0*2-1 + 1*2-2 + 0*2-3 + 0*2-4 + + 0*2-5 + 0*2-6 + 0*2-7 = 35.29687510; 43.2318 = 4*81 + 3*80 + 2*8-1 + 3*8-2 + 3*8-3 = 35.29882812510; 23.4C16 = 2*161 + 3*160 + 4*16-1 + 4*16-2 = 35.29687510.
Как видим, в результате обратных преобразований мы получили исходное число с точностью до одной сотой (как мы и планировали первоначально), что связано с появлением возможной погрешности в ходе преобразований дробных чисел из одной системы счисления в другую. Поэтому, в случае возникновения такой необходимости при расчетах, для повышения точности преобразований нужно брать не минимально возможное число разрядов, а несколько большее, в зависимости от необходимой точности.
Перевод чисел из системы счисления с основанием 2 n
в систему счисления с основанием 2 m и обратно
Точнее говоря, мы подробно рассмотрим только переводы между двоичной, восьмеричной и шестнадцатеричной системами счисления, т.к. они широко применяются в программировании.
1. В общем случае перевод чисел из двоичной системы счисления в систему счисления с основанием 2 n довольно прост и осуществляется по следующему общему алгоритму:
- разряды исходного двоичного числа группируются по n разрядов влево и вправо от точки, разделяющей целую и дробную части;
- далее, неполные группы двоичных цифр по краям исходного числа дополняются незначащими нулями;
- после чего каждую из полученных групп двоичных цифр заменяют соответствующей ей цифрой системы счисления с основанием 2 n .
Отметим, что для восьмеричной системы счисления разряды разбиваются на тройки, которые называют , а для шестнадцатеричной – на четверки, которые называют . Триады и тетрады вместе с соответствующими им цифрами в восьмеричной и шестнадцатеричной системах счисления представлены в следующей таблице:
| Триада | Число N8 | Тетрада | Число N16 |
|---|---|---|---|
| 000 | 0 | 0000 | 0 |
| 001 | 1 | 0001 | 1 |
| 010 | 2 | 0010 | 2 |
| 011 | 3 | 0011 | 3 |
| 100 | 4 | 0100 | 4 |
| 101 | 5 | 0101 | 5 |
| 110 | 6 | 0110 | 6 |
| 111 | 7 | 0111 | 7 |
| – | – | 1000 | 8 |
| – | – | 1001 | 9 |
| – | – | 1010 | A |
| – | – | 1011 | B |
| – | – | 1100 | C |
| – | – | 1101 | D |
| – | – | 1110 | E |
| – | – | 1111 | F |
Для наглядности рассмотрим пример перевода числа 10110010011.11010101100011 в восьмеричную и шестнадцатеричную системы счисления, используя указанный алгоритм и таблицу триад и тетрад:
10110010011.11010101100011 -> -> 010 110 010 011.110 101 011 001 100 -> 2623.653068;
10110010011.11010101100011 -> -> 0101 1001 0011.1101 0101 1001 1000 -> 593.D58C16.
2. Для перевода чисел из восьмеричной и шестнадцатеричной систем счисления в двоичную нужно:
- заменить каждую цифру числа соответствующей двоичной триадой или тетрадой (воспользовавшись таблицей выше);
- и далее, опустить незначащие нули в старших разрядах целой части и младших разрядах дробной части.
В качестве примера осуществим обратный перевод чисел предыдущего примера в двоичную систему:
2623.653068 -> 010 110 010 011.110 101 011 001 -> 010010110010011.11010101100011 -> 10010110010011.11010101100011; 593.D58C16 -> 0101 1001 0011.1101 0101 1001 1000 -> 010110010011.1101010110011000 -> 10110010011.11010101100011.
В конце добавим, что перевод чисел из восьмеричной системы счисления в шестнадцатеричную или обратно, можно осуществить в два этапа:
- в начале переводим число в двоичную систему счисления;
- а затем в нужную нам восьмеричную или шестнадцатеричную систему счисления.
Задачи на закрепление теории
1. Переведите число 1937 из 10 -й системы счисления в двоичную. Показать решение.
Решение pythonCodes
Для перевода целого числа из 10-ной системы в двоичную (или другую) систему счисления необходимо делить это число, фиксируя остатки от деления, на основание новой системы (в нашем случае это 2) до тех пор, пока частное не станет равным нулю. 1937:2 = 968 (остаток 1) //фиксируем 1 968:2 = 484 (остаток 0) //фиксируем 0 484:2 = 242 (остаток 0) //фиксируем 0 242:2 = 121 (остаток 0) //фиксируем 0 121:2 = 60 (остаток 1) //фиксируем 1 60:2 = 30 (остаток 0) //фиксируем 0 30:2 = 15 (остаток 0) //фиксируем 0 15:2 = 7 (остаток 1) //фиксируем 1 7:2 = 3 (остаток 1) //фиксируем 1 3:2 = 1 (остаток 1) //фиксируем 1 1:2 = 0 (остаток 1) //фиксируем 1 Результат: 193710 = 111100100012. Помним, что результат составляется из последовательности остатков, начиная с последнего!
Решение задачи №1
2. Переведите число 207 из 8 -й системы счисления в 10 -ную. Показать решение.
Решение pythonCodes
Вспоминаем, что в общем случае для перевода числа из системы счисления с основанием «n» в десятичную систему счисления нужно представить его в виде соответствующего полинома, а затем просто вычислить получившуюся сумму: 2078 = 2*82 + 0*81 + 7*80 = 128 + 0 + 7 = 13510 Результат: 2078 = 13510.
Решение задачи №2
3. Как известно, цветовая модель RGB (от англ. Red, Green, Blue) для получения цвета любого оттенка использует три десятичных числа от 0 до 255 или же три соответствующих шестнадцатеричных числа, которые описывают относительное содержание красного, зеленого и синего цветов. Так в HTML в случае десятичного представления формат записи значения цвета имеет вид rgb(r,g,b) . Если же используется шестнадцатеричное представление чисел, в котором разрешается использовать цифры от 0 до 9 и латинские буквы в любом регистре от A до F , то значение цвета записывают в формате #rrggbb . Например, правила p и p задают для абзаца одно и тоже значение коричневого цвета, соответствующее названию цвета brown .
а. Переведите значение цвета rgb(55,73,199) из 10 -го формата в 16 -ый.
b. Переведите 16 -ое значение цвета #FA453D в 10 -ый формат. Показать решение.
Решение pythonCodes
Решение пункта a задачи. Переведем 10-ное значение красного цвета в 16-ное: 55:16 = 3 (остаток 7) //фиксируем 7 3:16 = 0 (остаток 3) //фиксируем 3 Результат: 5510 = 3716. Переведем 10-ное значение зеленого цвета в 16-ное: 73:16 = 4 (остаток 9) //фиксируем 9 4:16 = 0 (остаток 4) //фиксируем 4 Результат: 7310 = 4916. Переведем 10-ное значение синего цвета в 16-ное: 199:16 = 12 (остаток 7) //фиксируем 7 12:16 = 0 (остаток 12) //фиксируем 1210 = C16 Результат: 19910 = C716. Т.о. rgb(55,73,199) -> #3749C7. ------------------------ Решение пункта b задачи. Переведем 16-ное значение красного цвета в 10-ное: FA16 = 15*161 + 10*160 = 240 + 15 = 25010 (F16 = 1510, A16 = 1010) Переведем 16-ное значение зеленого цвета в 10-ное: 4516 = 4*161 + 5*160 = 64 + 5 = 6910 Переведем 16-ное значение синего цвета в 10-ное: 3D16 = 3*161 + 13*160 = 48 + 13 = 6110 (D16 = 1310) Т.о. #FA453D -> rgb(250,69,61).
Решение задачи №3
4. Найдите значение выражения в десятичной системе счисления:
1E.A16 + 0101.11012 — 23.58 — 6.812510 . Показать решение.
Решение pythonCodes
Переводим числа в 10-ную систему счисления, составляя полиномы и вычисляя их суммы: 1E.A16 = 1*161 + 14*160 + 10*16-1 = 16 + 15 + 0.625 = 30.62510 Помним, что E16 = 1410, A16 = 1010. 0101.11012 = 0*23 + 1*22 + 0*21 + 1*20 + 1*2-1 + 1*2-2 + 0*2-3 + + 1*2-4 = 0 + 4 + 0 + 1 + 1/2 + 1/4 + 0 + 1/16 = = 5+13/16 = 5.812510 23.58 = 2*81 + 3*80 + 5*8-1 = 16 + 3 + 5/8 = 19.62510 Вычисляем: 30.625 + 5.8125 - 19.625 - 6.8125 = 10. Ответ: 10.
Решение задачи №4
5. Переведите десятичное число 3.79 в двоичную систему с точностью до одной тысячной в исходной системе счисления. Показать решение.
Решение pythonCodes
Переведем по отдельности целую и дробную части числа. 3:2 = 1 (остаток 1) //фиксируем 1 1:2 = 0 (остаток 1) //фиксируем 1 Результат: 310 = 112. При переводе дробной части учтем, что нам требуется точность 0.001 (к10 = 3) в 10-ной системе счисления. Поэтому количество разрядов, которое нам потребуется сохранить в итоговом числе, будет приблизительно равно: к2 = 3/(log102) ≈ 3/0.301 ≈ 9.96. Т.е. в итоговом числе нам потребуются 10 цифр после запятой. 0.79*2 = 1.58 //фиксируем 1 0.58*2 = 1.16 //фиксируем 1 0.16*2 = 0.32 //фиксируем 0 0.32*2 = 0.64 //фиксируем 0 0.64*2 = 1.28 //фиксируем 1 0.28*2 = 0.56 //фиксируем 0 0.56*2 = 1.12 //фиксируем 1 0.12*2 = 0.24 //фиксируем 0 0.24*2 = 0.48 //фиксируем 0 0.48*2 = 0.96 //фиксируем 0 Результат: 0.7910 = 0.11001010002. Итог: 3.7910 = 112 + 0.11001010002 = 11.11001010002.
Решение задачи №5
6. Переведите число 0112 в троичную систему счисления. Показать решение.
Решение pythonCodes
Чтобы перевести число из одной системы счисления в другую, нужно сперва перевести его в десятичную систему счисления, а уже потом в целевую. 1. 0112 = 0*22 + 1*21 + 1*20 = 0 + 2 + 1 = 310 2. 3:3 = 1 (остаток 0) //фиксируем 0 1:3 = 0 (остаток 1) //фиксируем 1 Результат: 310 = 103. Ответ: 0112 = 103.
Решение задачи №6
7. Переведите число 1748 в 16 -ную систему счисления. Показать решение.
Решение pythonCodes
Давайте вначале переведем число в двоичную, а уже потом и в 16-ную систему счисления. 1. Заменим каждую цифру числа соответствующей триадой (1 -> 001, 7 -> 111, 4 -> 100): 1748 = 0011111002 2. Разобьем полученное число на тетрады, дописав слева недостающие нули: 001111100 -> 0000 0111 1100. Используя таблицу тетрад, получаем цифры итогового числа: 0000 -> 0, 0111 -> 7, 1100 -> C. Получаем: 0011111002 = 7C16 Ответ: 1748 = 7C16.
Решение задачи №7
![]()
okpython.net Copyright © 2022-2023.
