Перейти к основному содержанию
CalcMax

Калькулятор двоичных чисел

Результат

10001

Двоичное

Десятичное
17
Шестнадцатеричное
11
Остаток
0

Калькулятор двоичных чисел складывает, вычитает, умножает и делит двоичные числа и печатает ответ сразу в трёх записях: двоичной, десятичной и шестнадцатеричной. Двоичная система счисления оставляет всего две цифры, 0 и 1, а сама арифметика остаётся той же, что и в десятичной, — меняется только место, где возникает перенос. В десятичной системе 9 + 1 даёт перенос, потому что основание равно десяти; в двоичной перенос даёт 1 + 1, потому что основание равно двум. Этого одного факта достаточно для всего сложения, а вычитание, умножение и деление устроены ровно так, как вы и ожидаете. Ответ печатается трижды, потому что три чтения годятся для разного: двоичное — то, зачем сюда пришли; десятичное — то, что можно проверить с ходу; шестнадцатеричное — те же биты, сгруппированные по четыре, как их читает всякий, кто пишет машинный код. Деление здесь целочисленное, поэтому остаток получает отдельную строку, а не растворяется в дробной части. Строки панели устроены по-разному, и это стоит заметить сразу. Двоичная строка, шестнадцатеричная строка и остаток — машинные записи: они печатаются ровно теми символами, какими их считает программа, без разделителей разрядов. Десятичная строка, наоборот, проходит через локализацию и печатается по русским правилам — с неразрывным пробелом между разрядами. Пробел этот только оформительский: если понадобится перенести это число в поле ввода, набирайте его подряд, без разделителей, — поля ввода в этом семействе разделителей не принимают. Верхняя граница у обоих операндов и у результата общая — 9 007 199 254 740 991, то есть 16 цифр в десятичной записи и 53 в двоичной. За этой границей двойная точность перестаёт различать соседние целые, и арифметика тихо перестала бы быть точной, поэтому слишком широкий ввод отклоняется, а не округляется.

Формула

1011 + 110 = 10001 (11 + 6 = 17)

1011
Первое число, записанное по основанию два. Именно чтение по основанию два и делает его одиннадцатью: те же цифры, прочитанные как десятичные, дали бы тысячу одиннадцать — ровно та ошибка, ради которой эта страница и существует
+ − × ÷
Действие. Оно идёт разряд за разрядом точно так же, как в десятичной системе, только десятка всюду, где происходит перенос или заём, заменена двойкой
1 + 1 = 10
Единственный факт двоичной арифметики, которого нет в десятичной. Две единицы дают нуль и единицу, ушедшую в следующий разряд, потому что цифры заканчиваются после единицы. Три единицы дают 11 — единица в ответе и единица в переносе
Σ (цифра × 2ⁿ)
Как получается десятичное чтение: каждая двоичная цифра умножается на вес своего разряда, и результаты складываются. Так 10001 превращается в семнадцать, и другого пути между двоичным ответом и десятичным нет
остаток
То, что остаётся, когда деление не выходит нацело. 1011, делённое на 10, даёт частное 101 и 1 в остатке, потому что одиннадцать — это пять двоек и ещё одна. Остаток показывается всегда, и он равен нулю у трёх действий, при которых остатка быть не может
53 бита
Какой ширины ввод принимает эта страница: до 9 007 199 254 740 991, то есть 16 цифр в десятичной записи и 53 в двоичной. За этой шириной машинное число перестаёт различать своих соседей, и арифметика тихо перестала бы быть точной

Двоичная арифметика нужна всякому, кто читает или пишет двоичный код, по той же причине, по какой нужен десятичный калькулятор: сама арифметика не трудна, но считать вручную долго, а ошибки невидимы. В повседневной работе это чтение аппаратного регистра или битовой маски и проверка значения, которое напечатал компилятор, отладчик или сетевой инструмент. Маски подсетей, биты прав доступа к файлу, столбец флагов в регистре состояния процессора и состояния выводов микроконтроллера — всё это двоичные числа, с которыми людям приходится считать, а шестнадцатеричное чтение рядом с ответом и есть та форма, в которой эти значения записывают в документации. Другое применение — учебное: правило переноса почти каждый ровно один раз понимает неправильно, и набрать 1011 плюс 110, увидев 10001, — более быстрый способ это исправить, чем разобранный пример в книге. Школьникам, разбирающим системы счисления вручную, и всякому, кто переводит листинг машинного кода обратно во что-то проверяемое, десятичное и шестнадцатеричное чтения сделают большую часть работы.

Разобранные примеры

  1. Складываем 1011 и 110

    1. Выровняйте числа по правому краю: 1011 и 0110
    2. Самый правый разряд: 1 + 0 = 1
    3. Следующий разряд: 1 + 1 = 10, значит пишем 0 и переносим 1
    4. Следующий разряд: 0 + 1 + перенесённая 1 = 10, значит пишем 0 и переносим 1
    5. Левый разряд: 1 + перенесённая 1 = 10, значит пишем 0 и переносим 1 в новый разряд
    6. Ответ читается как 10001, то есть 16 + 1 = 17 в десятичной записи

    Первый пример страницы и самый быстрый способ увидеть правило переноса: сумма длиннее любого из слагаемых, потому что последнему переносу понадобился собственный разряд. Десятичное чтение 17 и служит проверкой — 11 плюс 6 действительно 17, — а шестнадцатеричное 11 это те же биты, сгруппированные по четыре, отчего оно и совпало с десятичным одиннадцать. Совпадение исчезает, как только числа становятся больше.

  2. Делим 1011 на 10

    1. Это одиннадцать, делённое на два, поэтому ответ — пять и один в остатке
    2. Пять в двоичной записи это 101, а один это 1
    3. Страница сообщает частное 101 и остаток 1, а не печатает 101.1

    Пример, объясняющий, зачем нужна строка остатка. Напечатанное одним частным, 101 сказало бы, что одиннадцать, делённое на два, — это пять, и именно строка под ним делает утверждение верным. Есть и вторая причина не тянуться здесь к двоичной точке: как только у результата появляется дробная часть, арифметика может перестать обрываться — единица, делённая на три, в двоичной записи не кончается никогда, — а ввод и вывод этой страницы целые насквозь.

  3. Вычитаем 1011 из 110

    1. Это шесть минус одиннадцать, поэтому ответ отрицательный
    2. Разность равна пяти, а знак выносится перед результатом
    3. Пять это 101, значит ответ -101

    Здесь нигде не используется дополнение до двух — схема, которой процессор хранит отрицательные числа. Минус остаётся знаком перед числом: так пишут на бумаге, и так запись остаётся читаемой рядом с её десятичным и шестнадцатеричным чтениями. Машинное представление того же значения было бы набором бит фиксированной ширины, а ширины у этой страницы нет.

Ограничения

Страница работает только с целыми числами. Двоичной точки и дробных двоичных чисел здесь нет, поэтому 1.01 не принимается — из этого же следует, что деление, не выходящее нацело, даёт частное и остаток вместо десятичной дроби, причём частное усекается к нулю, а не округляется. Ввод ограничен значением 9 007 199 254 740 991 — это 16 цифр в десятичной записи и 53 в двоичной; за этой границей точность арифметики больше не гарантируется, и слишком большой ввод отклоняется, а не получает приближённый ответ. Результат подчинён тому же потолку, поэтому умножение, выходящее за него, сообщает об ошибке вместо неверного числа. Отрицательные числа пишутся со знаком минус перед числом, а не в дополнении до двух, и никакая фиксированная битовая ширина не предлагается и не подразумевается: 1011 здесь четыре бита, а не младшие четыре бита регистра. Деление на нуль отклоняется. Двоичная строка, шестнадцатеричная строка и остаток — машинные записи без разделителей разрядов, а десятичная строка печатается по русским правилам и содержит неразрывные пробелы между разрядами; чтобы перенести её значение в поле ввода, набирайте его подряд, без разделителей.

Частые вопросы

Почему 1 + 1 равно 10, а не 2?
Потому что для двойки в двоичной системе нет цифры. Цифры — это 0 и 1, а дальше разряд заканчивается, точно так же, как в десятичной системе заканчивается разряд единиц после 9. Поэтому две единицы дают нуль в этом разряде и единицу, ушедшую в следующий, что и записывается как 10, — а это то же самое утверждение, что и десятичное 9 + 1 = 10, только с другим основанием. Три единицы дают 11: единица в ответе и единица в переносе.
Почему строка остатка есть всегда, даже когда я складываю или умножаю?
Потому что панель результатов — фиксированный список, а не список, который растёт и укорачивается вместе с выбранным действием; строка, которая появлялась бы и исчезала, читалась бы хуже, чем строка, всегда стоящая на одном месте. Вычитание, сложение и умножение целых чисел остатка не оставляют, поэтому там читается 0 — этот нуль говорит, что остатка действие не оставило, а не что его не удалось вычислить. Деление здесь единственное действие, которое может его оставить, и именно эта строка мешает усечённому частному выглядеть точным ответом.
Какое самое большое число можно ввести?
9 007 199 254 740 991 — это 16 цифр в десятичной записи и 53 в двоичной, а в шестнадцатеричной записи 1FFFFFFFFFFFFF. Предел этот — та ширина, на которой машина перестаёт различать соседние целые числа, поэтому за ним арифметика тихо перестала бы быть точной: результат выглядел бы числом и числом бы не был. Более широкий ввод отклоняется с сообщением, а не усекается и не округляется; результат, выходящий за тот же потолок, тоже отклоняется.
Можно ли вычитать и получать отрицательный ответ?
Да. Поставьте большее число во второе поле, и ответ вернётся со знаком минус перед числом — во всех трёх чтениях. Это не дополнение до двух, которым процессор хранит отрицательное число в битах фиксированной ширины, а форма со знаком перед числом: так вы написали бы на бумаге, и так запись остаётся разборчивой рядом с десятичным и шестнадцатеричным чтениями. Никакая битовая ширина не подразумевается, поэтому отрицательный ответ не сворачивается в набор единиц.
Почему деление не точное?
Потому что страница работает с целыми числами, так что деление, не выходящее нацело, даёт частное, усечённое к нулю, и остаток. Одиннадцать, делённое на два, — это пять и один в остатке, и страница сообщает 101 и 1, а не 101.1. Это осознанный выбор, а не пробел: как только у результата появляется дробная часть, арифметика может не оборваться — единица, делённая на три, в двоичной записи даёт бесконечную дробь, — а страница, которая тихо округлила бы её, напечатала бы число, не являющееся ответом.
Зачем нужно шестнадцатеричное чтение?
Это то же значение, сгруппированное по четыре бита, — так двоичную запись читают те, кто пишет машинный код. Байт — это восемь битов, то есть ровно две шестнадцатеричные цифры, поэтому FF, 2A и B2 и есть та форма, в которой значения появляются в документации, отладчиках и описаниях микросхем. Перевод между двоичной и шестнадцатеричной записью вообще не вычисление, а перегруппировка, отчего это чтение здесь и достаётся бесплатно.

Источники

Похожие калькуляторы