ПЕРЕВОД ЧИСЕЛ ИЗ ДВОИЧНОЙ СИСТЕМЫ В ДЕСЯТИЧНУЮ
Задача перевода чисел из двоичной системы счисления в десятичную чаще всего возникает уже при обратном преобразовании вычисленных либо обработанных компьютером значений в более понятные пользователю десятичные цифры. Алгоритм перевода двоичных чисел в десятичные достаточно прост (его иногда называют алгоритмом замещения):
Для перевода двоичного числа в десятичное необходимо это число представить в виде суммы произведений степеней основания двоичной системы счисления на соответствующие цифры в разрядах двоичного числа.
Например, требуется перевести двоичное число 10110110 в десятичное. В этом числе 8 цифр и 8 разрядов ( разряды считаются, начиная с нулевого, которому соответствует младший бит). В соответствии с уже известным нам правилом представим его в виде суммы степеней с основанием 2:
101101102 = (1·2 7 )+(0·2 6 )+(1·2 5 )+(1·2 4 )+(0·2 3 )+(1·2 2 )+(1·2 1 )+(0·2 0 ) = 128+32+16+4+2 = 18210
Из этого примера видно, в частности, что десятичная система счисления более компактно отображает числа — 3 цифры (т.е. бита) вместо 8 цифр в двоичной системе счисления. Для вычислений «вручную» и решения примеров и контрольных заданий вам могут пригодиться таблицы степеней оснований изучаемых систем счисления (2, 8, 10, 16), приведенные в Приложении.
Перевод из двоичной системы счисления в десятичную
Вы делитесь ссылкой на ваш сохраненный расчет. Изменения, внесенные в расчет, будут автоматически доступны по ссылке.
Вы делитесь ссылкой на статичный расчет. При изменении вами расчета, изменения не будут транслироваться по ссылке.
Как перевести
Преобразовать число из двоичной системы счисления в десятичную можно следующим образом: каждый разряд числа необходимо умножить на 2 n , где n — номер разряда, начиная с 0. Затем суммировать полученные значения.
1102 = (1*2 2 + 1*2 1 + 0*2 0 )10 = 610
100100102 = (1*2 7 + 0*2 6 + 0*2 5 + 1*2 4 + 0*2 3 + 0*2 2 + 1*2 1 + 0*2 0 )10 = 14610
Смотрите также
- Перевод из двоичной в восьмеричную
- Перевод из двоичной в шестнадцатеричную
- Перевод из десятичной в двоичную
- Перевод из десятичной в восьмеричную
- Перевод из десятичной в шестнадцатеричную
- Перевод из восьмеричной в двоичную
- Перевод из восьмеричной в десятичную
- Перевод из шестнадцатеричной в двоичную
- Перевод из шестнадцатеричной в десятичную
Учебно-методическое пособие по курсу для студентов
1.5. Перевод чисел из десятичной системы счисления в любую другую
Для перевода чисел из десятичной с/с в любую другую, необходимо делить десятичное число на основание системы, в которую переводят, сохраняя при этом остатки от каждого деления.
Результат формируется справа налево. Деление продолжается до тех пор, пока результат деления не станет меньше делителя.
Пример 9. Перевести число 13 из десятичной системы счисления в двоичную систему:
Пример 10. Перевести число 13 из десятичной системы счисления в восьмеричную систему:
Пример 11. Перевести число 638 из десятичной системы счисления в шестнадцатеричную систему:
Остатки записываются в шестнадцатеричном виде (14 => Е).
Пример 12. Сложение двоичных чисел:
Для проверки результата сложения двоичное число нужно разбить на триады, перевести в восьмеричную систему счисления согласно таблице 1, а затем перейти в десятичную систему и осуществить сложение.
Пример 13. Сложение шестнадцатеричных чисел:
Перед сложением необходимо перейти согласно таблице 1 в 10-ю систему счисления, произвести сложение, затем опять вернуться к 16-ой системе счисления.
Перевод в десятичную систему счисления больших двоичных чисел
Переведите в BCD с помощью «дабл дабл», в нем на каждую деятичную цифру полбайта. потом уже раздвиньте до нужного представления. en.wikipedia.org/wiki/Double_dabble Обратите внимание, сдвиги там чаще чем прибавление, так что можно двигать небольшую часть исходного числа, вовремя подхватывая новые байты. Только при add 3 придется подумать как перенос делать (который то же можно было бы накапливать что бы не проводить его постоянно по всему числу. С другой стороны перенос все равно на первом же 0 бите остановится
11 апр 2017 в 21:45
Алгоритм такой: делим число на 10 получаем остаток и целый результат. остаток деления (от ‘0’ до ‘9’) записываем вначало строки. Если целый результат деления больше 0, повторяем операцию.
12 апр 2017 в 7:51
@Mike: алгоритм похоже для чисел, которые в регистре помещаются (в железе реализовать). Для больших чисел возможно лучше «разделяй и властвуй» sub-quadratic подход из GMP использовать
13 апр 2017 в 13:46
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Требуемый алгоритм несложен.
Для перевода числа в другую систему счисления достаточно многократного деления с остатком на основание новой системы счисления, при котором частное используется в качестве нового делителя. Запись числа в новой системе счисления — это последовательность остатков, записанная в обратном порядке.
С практической точки зрения, делить длинное число на 10 — не лучший вариант. Лучше использовать промежуточную систему счисления (например, по основанию 1 000 000 или 1 000 000 000), что сокращает количество «длинных» делений.
Отслеживать
ответ дан 12 апр 2017 в 20:21
Yuri Negometyanov Yuri Negometyanov
5,188 18 18 серебряных знаков 40 40 бронзовых знаков
это звучит как квадратичный алгоритм. Если число «большое», то цифр может быть много и можно долго ждать результата для O(n**2) алгоритма. Можно посмотреть, что GMP использует для получения десятичных цифр
13 апр 2017 в 13:26
@jfs Пока неясно, о каком диапазоне больших числел речь, вопрос повисает в воздухе
13 апр 2017 в 18:08
Алгоритм приходит легко, если понимать запись двоичного числа. Например, рассмотрим двоичное число ниже:
В десятичной форме оно будет выглядеть так:
dec_num = 2^0 + 2^5 + 2^7 = 161
То есть мы просто сложили двойки в степенях позиций с ненулевыми значениями. Как же нам это закодить?
На каждой итерации нашего алгоритма мы должны знать:
1)позицию элемента(в общем-то это есть значение нашего счётчика цикла)
2)цифру числа в данной позиции
Чтобы узнать последнюю цифру числа достаточно взять остаток от деления по модулю 10(операция bin_num%10). Но как тогда узнать предпоследнюю? Очень просто! Достаточно модифицировать наше бинарное число в конце каждой итерации следующим образом bin_num/=10. Применяя эту операцию, мы как бы сдвигаем число вправо, делая его предпоследнюю цифру последней, чтобы операция bin_num%10 давала нужный результат.

Надеюсь этих рассуждений достаточно, чтобы найти верное решение:)
