Конвертер из двоичной в десятичную
Результат
Десятичное
- Разрядные значения
- 8 + 2 + 1
Конвертер из двоичной системы в десятичную превращает число, записанное по основанию два, в то же самое число, записанное по основанию десять. Значение при этом не меняется — меняется только запись, и вся разница между этими двумя записями держится на одном правиле: разряд стоит столько, сколько даёт его цифра, умноженная на степень двойки. Это и есть позиционная запись, и она вам уже знакома по десятичной системе: число 352 — это три сотни плюс пять десятков плюс две единицы, потому что каждый разряд стоит в десять раз больше соседа справа. Двоичная система счисления берёт в качестве основания двойку, поэтому её разряды стоят вдвое больше соседа справа и идут 1, 2, 4, 8, 16, 32 и дальше, а цифрами бывают только 0 и 1. Перевод после этого сводится к тому, чтобы сложить разряды, в которых стоит 1, и пропустить те, в которых стоит 0: 1011 — это 8 плюс 2 плюс 1, то есть 11. Именно эта сумма и печатается под ответом, по одному слагаемому на каждую единичную цифру, потому что ошибаются в ней чаще всего: пропускают разряд или начинают счёт не с того конца. Цифры читаются справа налево, а не слева направо — самый правый бит всегда стоит 1, какой бы длины ни было двоичное число. Ведущие нули ничего не меняют: 00001011 и 1011 — это одно и то же число, и сумма для них печатается одинаковая. Строки панели устроены по-разному. Строка разрядных значений — машинная запись: она печатается ровно теми символами, какими её считает программа, без разделителей разрядов, и нулевые слагаемые в неё не попадают. А десятичная запись, наоборот, проходит через локализацию и печатается по русским правилам — с неразрывным пробелом между разрядами, поэтому тысяча двадцать четыре на панели выглядит как 1 024. Пробел этот только оформительский: если понадобится перенести это число в другое поле, набирайте его подряд, без разделителей, — поля ввода в этом семействе разделителей не принимают. Само разрядное значение при этом не теряется, меняется только оформление. Ввод принимается длиной до 53 цифр — до 9 007 199 254 740 991, то есть 16 цифр в десятичной записи. За этой границей машина перестаёт различать соседние целые числа, и слишком длинный ввод отклоняется, а не читается приблизительно.
Разрядное значение каждого бита в байте — от самого левого до самого правого
| Бит | Степень | Значение |
|---|---|---|
| 7 | 2⁷ | 128 |
| 6 | 2⁶ | 64 |
| 5 | 2⁵ | 32 |
| 4 | 2⁴ | 16 |
| 3 | 2³ | 8 |
| 2 | 2² | 4 |
| 1 | 2¹ | 2 |
| 0 | 2⁰ | 1 |
Это та линейка, по которой выполняется перевод, и она постоянна: она не меняется вслед за вводом наверху, поэтому расхождение между ними не противоречие. Панель отвечает про набранное число, а таблица — про более общий вопрос о том, сколько стоит каждая позиция в байте, и этот вопрос встаёт первым, когда числа на руках ещё нет. Читайте строки сверху вниз как последовательное деление на два, а снизу вверх как удвоение, и закономерность объяснит себя сама: самый правый бит стоит 1, потому что это разряд единиц, соседний с ним стоит 2, потому что основание равно двум, и каждый шаг влево удваивает. Останавливается таблица после восьми строк потому, что байт — это то место, где живут значения, которые люди и переводят: флаг состояния, канал цвета, маска прав доступа, — а таблица до пятьдесят третьего бита была бы стеной чисел, которую никто не читает. Единичные биты числа считываются с этой таблицы и складываются, так что таблица и напечатанная выше сумма описывают одни и те же восемь позиций двумя разными способами. Одно предупреждение о направлении: номера битов здесь считаются справа, поэтому бит 0 — это последняя цифра, и документ, считающий биты слева, разойдётся с этой таблицей в каждой строке, имея в виду то же самое.
Формула
1011 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 2 + 1 = 11
- двоичное число
- Число, которое предстоит прочитать, записанное по основанию два. Его цифры — это 0 и 1 и ничего больше, а значение всего числа зависит от того, где стоит каждая цифра, а не от того, сколько их всего
- 2ⁿ
- Разрядное значение позиции: два в степени, равной расстоянию от этой позиции до правого конца, причём самая правая позиция считается нулевой. Ряд получается 1, 2, 4, 8, 16, 32, 64, 128, и каждый следующий член вдвое больше предыдущего
- цифра × 2ⁿ
- Одно слагаемое суммы. Поскольку цифра равна либо 0, либо 1, умножение никогда ничего не меняет: единица приносит своё разрядное значение целиком, а нуль не приносит ничего, и потому весь перевод сводится к отбору позиций, в которых стоит единица
- Σ
- Сложение всех слагаемых. Это и есть весь перевод: сложите разрядные значения единичных битов, и полученная сумма будет тем же числом в десятичной записи
- 8 + 2 + 1
- Сумма, записанная без нулевых слагаемых, — так её и пишут от руки. В числе 1011 единицы стоят в разрядах 8, 2 и 1, а в разряде 4 стоит нуль, поэтому четвёрка в сумму не попадает: заметить её отсутствие и есть цель, потому что именно на этом шаге счёт и теряют
- 53 бита
- Какой длины может быть ввод: 53 двоичные цифры, то есть до 9 007 199 254 740 991, а это 16 цифр в десятичной записи. Это та ширина, на которой машина перестаёт различать соседние целые числа, поэтому более длинный ввод нельзя прочитать точно, и он отклоняется, а не угадывается
Этот перевод нужен в двух направлениях чтения. Прямой случай — значение, которое пришло в двоичной записи и должно быть понято: байт состояния, напечатанный отладчиком, столбец флагов аппаратного регистра, битовая маска в файле настроек, вывод сетевого инструмента или домашнее задание, ответ к которому полагается записать по основанию десять. Обратный случай — рассуждение о степенях двойки, которое прячется за обычными числами: является ли число степенью двойки, какая степень двойки идёт следующей за некоторой величиной, сколько битов нужно, чтобы хранить значение, и какой диапазон адресует шина заданной ширины, — все эти вопросы решаются взглядом на то, какие позиции выставлены. Программисты встречают ту же сумму, когда считают маску подсети, упаковывают несколько небольших значений в одно целое или проверяют, какие из набора возможностей включены в хранимом числе. Именно строка разрядных значений и делает страницу полезной ещё и как учебный материал: правило переноса и веса разрядов — это две вещи, которые выглядят произвольными до тех пор, пока сумма не выписана, а страница выписывает эту сумму для того, что вы набрали, и разобранный пример из книги превращается в проверку собственного решения. Всякий, кто читает двоичное число вручную, и всякий, кому нужно знать, почему ответ именно такой, а не только какой он, получают отсюда одно и то же.
Разобранные примеры
Читаем 1011
- Подпишите разрядные значения под четырьмя цифрами, начиная справа: 1, 2, 4, 8
- Оставьте цифры, равные 1, и отбросьте те, что равны 0: остаются 8, 2 и 1
- В разряде 4 стоит 0, поэтому он не даёт ничего и в сумму не попадает
- Сложите их: 8 + 2 + 1 = 11
Значение по умолчанию и пример, в котором видно пропущенное слагаемое: в числе 1011 в разряде четвёрок стоит нуль, поэтому сумма читается как 8 + 2 + 1, а не как 8 + 4 + 2 + 1. Если прочитать эти цифры как десятичные, получится тысяча одиннадцать — самый распространённый способ ошибиться в этом переводе.
Читаем целый байт, 10110010
- Восемь цифр означают, что разрядные значения идут от 128 вниз до 1
- Выставленные позиции — это 128, 32, 16 и 2
- Сложите их: 128 + 32 = 160, плюс 16 будет 176, плюс 2 будет 178
- Самое большое значение, которое вмещает байт, — это 11111111, то есть 255
Стоит разобрать один раз, потому что байт — та ширина, на которой на практике приходит почти любое двоичное значение, а знание того, что левый бит стоит 128, а правый стоит 1, и делает байт читаемым с одного взгляда. Те же восемь цифр, прочитанные с другого конца, дали бы совсем другое, так что направление здесь не подробность.
Ведущие нули значения не меняют
- Четыре ведущих нуля стоят в разрядах 128, 64, 32 и 16
- Нуль не даёт ничего, где бы он ни стоял, поэтому эти позиции из суммы выпадают
- Остаётся та же самая сумма 8 + 2 + 1, дающая 11
Дописывать значение до фиксированной ширины — обычное дело: байт записывают как 00001011, а не как 1011, когда ширина важна, поэтому конвертер обязан принимать обе формы и давать на них один и тот же ответ. Он его и даёт, а напечатанная сумма у них совпадает, потому что ведущие нули в неё никогда не входят.
Читаем отрицательное значение, -1011
- Знак минус не является частью двоичного числа — это знак перед ним
- Прочитайте цифры как раньше: 1011 — это 8 + 2 + 1 = 11
- Верните знак на место: значение равно -11
Знак остаётся снаружи цифр, а не сворачивается в них, потому что сворачивать его здесь не во что: фиксированной ширины у этой страницы нет. Процессор, хранящий -11 в восьми битах, записал бы 11110101 — совершенно другую строку цифр, и её вид зависел бы от того, что ширина равна восьми. Ширины здесь нет, поэтому знак остаётся знаком.
Ограничения
Эта страница читает только целые двоичные числа. Двоичной точки здесь нет, поэтому 1.01 не принимается и не переводится: дробное чтение потребовало бы второго правила о том, где стоит точка, и это правило пришлось бы задавать для каждого ввода отдельно, а не подразумевать. Длина ввода — не более 53 цифр, то есть до 9 007 199 254 740 991 в десятичной записи, а это 16 цифр; более длинные значения машина не удержит точно, и они отклоняются, а не округляются. Ведущие нули принимаются и игнорируются, поэтому 00001011 и 1011 — одно и то же число, и напечатанная для них сумма совпадает. Знак минус перед числом принимается и переносится в оба вывода. Страница переводит из двоичной записи в десятичную; обратное направление — отдельная страница, ссылка на неё ниже, а 16-ричное чтение — ещё на одной. Ни арифметики, ни побитовых операций здесь нет: ни AND, ни OR, ни XOR, ни сдвига.
Частые вопросы
- Как перевести двоичное число в десятичное вручную?
- Подпишите разрядные значения под цифрами, начиная с 1 справа и удваивая при каждом шаге влево: 1, 2, 4, 8, 16 и так далее. Затем оставьте значения, стоящие под единицами, отбросьте те, что стоят под нулями, и сложите оставшееся. Для 1011 это даёт 8, 2 и 1, то есть 11. Ошибаются здесь двумя способами: читают цифры слева вместо справа и прибавляют разрядное значение, под которым стоит нуль, — и то и другое напечатанная на этой странице сумма покажет, потому что в неё попадают только те слагаемые, которые что-то значат.
- Почему в ответ не входят разрядные значения с нулём под ними?
- Потому что они не дают ничего, а выписанные подряд они скрыли бы то, что важно. Нуль, умноженный на любое разрядное значение, даёт нуль, поэтому слагаемое вроде 0×4 можно отбросить, не изменив сумму. Сумма показывается как 8 + 2 + 1, а не как 8 + 0 + 2 + 1, именно для того, чтобы пропущенная четвёрка была видна: увидеть, какие позиции отсутствуют, — это и есть способ проверить, что цифры вообще выровнены правильно.
- Меняет ли число ведущий нуль?
- Нет. Ведущие нули стоят в позициях, которые ничего не дают, точно так же, как в десятичной системе, где 007 всё ещё семь. 00001011 и 1011 — одно и то же число, и эта страница выдаёт для них одинаковые оба вывода. Дописывание до фиксированной ширины обычно там, где ширина что-то значит, — байт принято записывать всеми восемью цифрами, — поэтому принимать дополненную форму необходимо, а не удобно.
- Какое самое длинное двоичное число здесь можно перевести?
- 53 цифры, то есть до 9 007 199 254 740 991 в десятичной записи, а это 16 цифр. Предел этот выбран не страницей: это та ширина, на которой машинное число перестаёт различать соседние целые, поэтому более длинный ввод нельзя прочитать точно, и странице пришлось бы напечатать то, что выглядит ответом и ответом не является. Слишком длинный ввод отклоняется с сообщением. Здесь это важнее, чем на страницах с арифметикой, потому что перевод звучит как чтение, а чтение звучит безграничным.
- Это то же самое, что последовательное деление на два?
- Это тот же ответ другим путём. Последовательное деление на два выдаёт цифры справа, и этот способ нужен в обратную сторону — из десятичной записи в двоичную. При переводе из двоичной в десятичную сумма разрядных значений короче, потому что цифры уже известны и сложить нужно только их веса. Верны оба способа; страница печатает сумму, потому что её можно проверить с одного взгляда.
- Можно ли перевести двоичное число с дробной частью?
- Здесь — нет. Эта страница читает целые числа, поэтому двоичная точка отклоняется, а не угадывается. Дроби в двоичной записи вполне определены — позиции справа от точки стоят половину, четверть, восьмую и так далее, — но странице, которая их принимала бы, пришлось бы решать, сколько из них показывать и как округлять последнюю, а это семейство страниц работает с целыми числами насквозь. Одинаковое место этой границы на каждой странице группы означает, что один и тот же ввод не будет принят одной страницей и отклонён другой.
Источники
- Binary number — positional notation, place values, and the conversion between base two and base ten — Wolfram MathWorld (United States)
- Number base — why a numeral's value depends on its position and on the base, and how one quantity is written in several bases — Wolfram MathWorld (United States)
- Powers of two — the sequence 1, 2, 4, 8, 16 … that a binary number's place values are taken from, catalogued as OEIS A000079 — OEIS Foundation Inc. (United States)