Калькулятор двоичных чисел
Вычисляйте с двоичными числами: сложение, вычитание, умножение, деление с остатком, побитовые операции И, ИЛИ, XOR, НЕ, а также сдвиги влево и вправо. Введите два двоичных значения — и получите точный результат в двоичной, десятичной, шестнадцатеричной и восьмеричной системах счисления с пошаговым ходом вычислений.
Сложение, вычитание, умножение и побитовые операции над двоичными числами
Двоичная арифметика — основные правила
Где:
- \(b_i\) — отдельный бит, равный 0 или 1
- \(i\) — позиция бита, отсчитываемая справа и начиная с нуля
- \(2^i\) — разрядный вес (значимость) этой позиции
Двоичные числа записываются только цифрами 0 и 1, и вес каждой позиции — степень двойки. Арифметика здесь работает точно так же, как в десятичной системе, только со столбиками по основанию 2: при сложении \(0+0=0\), \(0+1=1\), а \(1+1=10_2\) (пишем 0, переносим 1); при вычитании \(1-0=1\), \(1-1=0\), а для \(0-1\) нужно занять 1 из следующего разряда (это 2), чтобы написать 1.
Побитовые операции устроены иначе: каждый бит результата зависит только от двух битов операндов в том же столбце — как если бы числа были записаны одно под другим. Сдвиг влево на \(k\) разрядов умножает число на \(2^k\) в пределах слова фиксированной ширины, а арифметический сдвиг вправо на \(k\) разрядов делит на \(2^k\), округляя в сторону \(-\infty\).
Калькулятор двоичных чисел — пример вычисления
Пример: сложим двоичные числа A = 1011 и B = 0110 (те же значения, что стоят в калькуляторе по умолчанию).
Сначала переведём оба числа в десятичную систему, используя веса разрядов \(2^3, 2^2, 2^1, 2^0\):
\[ 1011_2 = 8 + 0 + 2 + 1 = 11_{10}, \qquad 0110_2 = 0 + 4 + 2 + 0 = 6_{10} \]
Теперь складываем столбиком справа налево, перенося 1 всякий раз, когда сумма в разряде достигает 2 или больше:
\[ 1011_2 + 0110_2 = 10001_2 \]
Проверка в десятичной системе: \(11 + 6 = 17\), и действительно \(10001_2 = 16 + 1 = 17\).
Результат: 10001 в двоичной системе, 17 в десятичной, 0x11 в шестнадцатеричной и 0o21 в восьмеричной.
Как пользоваться калькулятором
- Выберите операцию из выпадающего списка: сложение, вычитание, умножение, деление с остатком, одну из побитовых операций (И, ИЛИ, XOR, НЕ) или битовый сдвиг (A << B, A >> B).
- Введите первое число (A), используя только цифры 0 и 1; для отрицательных значений поставьте минус перед числом. Пробелы внутри числа игнорируются.
- Так же введите второе число (B). Для операции НЕ используется только A; для сдвигов B — это величина сдвига (её тоже записывают в двоичном виде).
- Для операций НЕ, сдвига влево и сдвига вправо выберите разрядность (8, 16, 32 или 64 бита). Результат этих трёх операций — слово выбранной ширины в дополнительном коде.
- Ознакомьтесь с результатами: ответ в двоичной системе, а также его десятичное, шестнадцатеричное и восьмеричное представления. При делении дополнительно выводится остаток, а панель «Ход вычислений» показывает, как получен ответ.
Что такое двоичная арифметика
Двоичная система — родной язык цифровой техники: бит равен 0 или 1, потому что транзистор закрыт или открыт. Любое двоичное число — это последовательность битов, в которой позиция \(i\) справа имеет вес \(2^i\). Поэтому 1011 — это не «одна тысяча одиннадцать», а \(1\cdot8 + 0\cdot4 + 1\cdot2 + 1\cdot1 = 11\). Как только вы начинаете читать числа таким образом, все четыре арифметических действия выполняются привычным школьным способом — просто переносить нужно при 2, а не при 10.
Побитовые операции работают иначе: они обрабатывают каждый столбец независимо, и именно поэтому они идеальны для масок и флагов. Операция И над двумя числами оставляет только биты, установленные в обоих; ИЛИ — биты, установленные хотя бы в одном; XOR — биты, установленные ровно в одном. В таблице ниже показано правило для одного столбца:
| A | B | A И B | A ИЛИ B | A XOR B |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Сдвиги — это двоичный способ умножать и делить на степени двойки. Сдвиг 1011 влево на 2 разряда даёт 101100, то есть \(11 \times 4 = 44\), — при условии, что ни один бит не «выпадет» за левую границу слова. Именно поэтому разрядность так важна: в 32-битном регистре 1, сдвинутая влево на 31, ещё помещается, а после сдвига влево на 32 бит теряется, и результат превращается в 0. Этим приёмом пользуются повсюду — от масок изображений до разбиения IP-сетей на подсети, где калькулятор CIDR применяет ту же логику битовых масок к диапазонам адресов.
Если нужно перевести одно число из системы в систему, а не вычислять с двумя числами, воспользуйтесь двоичным конвертером; шестнадцатеричный конвертер делает то же самое для шестнадцатеричной записи, которую часто предпочитают программисты.
Допущения, ограничения и советы
- До 1024 бит на входное число. Все вычисления выполняются с точной целочисленной арифметикой, поэтому даже очень длинные двоичные числа дают точный ответ — без округления и без переполнения в режимах сложения, вычитания, умножения, деления и побитовых операций.
- НЕ и сдвиги имеют фиксированную ширину. Они вычисляются внутри слова выбранного размера — точно так же, как в регистре процессора. Шестнадцатеричные и восьмеричные результаты этих операций выводятся как беззнаковые битовые последовательности этой ширины, дополненные ведущими нулями.
- Деление усекается к нулю и сообщает остаток, как операторы
/и%в JavaScript, C и Java: A = B × Q + R, где |R| < |B|, а R имеет знак делимого A. - Пошаговые таблицы (строки переноса, строки заёма, столбцы побитовых операций) строятся для чисел длиной до 64 бит, а для умножения — при не более чем 24 установленных битах в B; более длинные входные данные всё равно вычисляются точно, просто без наглядной разбивки по шагам.
- Ведущие нули не меняют значения —
0110и110— это одно и то же число 6, — однако для операций НЕ и сдвигов они определяют форму слова, поэтому, если вам важно заполнение, укажите разрядность явно. - Отрицательные числа принимаются только в форме «знак-величина» (с минусом впереди); калькулятор преобразует их внутренне и выводит результат со знаком минус, а не в виде дополнительного кода (кроме режимов НЕ и сдвига).
Часто задаваемые вопросы
Как перевести двоичное число в десятичное вручную?
Подпишите над каждым битом степени двойки справа налево: 1, 2, 4, 8, 16 и так далее, а затем сложите степени, под которыми стоит 1. Например, \(1101_2 = 8 + 4 + 0 + 1 = 13\). Самый правый бит (позиция 0) всегда имеет вес \(2^0 = 1\), и каждый шаг влево удваивает вес.
Как пошагово перевести десятичное число в двоичное?
Последовательно делите число на 2, записывая остаток на каждом шаге, пока не получите 0. Затем прочитайте остатки снизу вверх. Для числа 13: \(13 \div 2 = 6\), остаток 1; \(6 \div 2 = 3\), остаток 0; \(3 \div 2 = 1\), остаток 1; \(1 \div 2 = 0\), остаток 1 — последовательность остатков 1101 и есть двоичная запись числа.
Почему в двоичной системе 1 + 1 равно 10?
Потому что в двоичной системе нет цифры 2. Когда сумма в разряде равна 2, в этом разряде пишут 0, а 1 переносят в следующий разряд слева — точно так же, как в десятичной системе переносят, когда разряд превышает 9. Поэтому \(1 + 1 = 10_2\), что читается как «один-ноль»: одна двойка и ноль единиц — двоичный способ записи числа два.
Чем различаются операции И, ИЛИ и XOR?
Все три сравнивают два числа разряд за разрядом. И даёт 1 только там, где у обоих операндов стоит 1, — удобно для извлечения и маскирования битов. ИЛИ даёт 1 там, где хотя бы у одного операнда стоит 1, — удобно для установки битов. XOR даёт 1 там, где ровно у одного операнда стоит 1, — удобно для переключения битов, причём XOR числа с самим собой всегда равен 0.
Зачем для операций НЕ и сдвигов выбирать разрядность?
НЕ и сдвиги меняют количество битов в результате, поэтому ответ зависит от размера «контейнера» — так же, как в регистре процессора. В 8-битном слове NOT 0000 0101 инвертирует все биты, включая ведущие нули, и даёт 1111 1010. Аналогично сдвиг влево на k разрядов умножает число на \(2^k\) только если ни один бит не выпадает за левую границу слова, — иначе значение «заворачивается».
Что происходит с отрицательными числами в двоичной системе?
Этот калькулятор принимает отрицательные числа со знаком минус впереди и вычисляет точные результаты со знаком. Однако в операциях НЕ и сдвига фиксированной ширины отрицательные числа подчиняются соглашению о дополнительном коде: \(-A\) хранится как \(2^w - A\) в w-битном слове, а NOT A равен \(-A - 1\). Именно поэтому NOT 0 при любой разрядности даёт −1.
Какие ошибки чаще всего допускают при двоичных вычислениях вручную?
Забывают перенос, когда разряд даёт 2; при вычитании занимают 10 вместо 2; ошибочно читают результат как десятичные цифры (1011 — это одиннадцать, а не одна тысяча одиннадцать). Следите и за направлением сдвига: сдвиг влево умножает на \(2^k\), а сдвиг вправо делит, отбрасывая остаток, — сдвиг 1011 (11) вправо на 1 разряд даёт 101 (5), а не 22.
Даёт ли двоичное деление дробный результат?
Нет — калькулятор выполняет целочисленное деление с остатком, как операторы / и % в JavaScript, C или Java. Частное усекается к нулю, а остаток удовлетворяет равенству A = B × Q + R и имеет знак делимого. Деление на ноль отклоняется с сообщением об ошибке, поскольку частное в этом случае не определено.